2016-07-25 17 views
0

私はrequests.getがブロックであるべきだと思うので、runとrun2の間に違いはないはずです。なぜgeventはダウンロード要求をスピードアップできますか?

import sys 

import gevent 
import requests 
from gevent import monkey 
monkey.patch_all() 
def download(): 
    requests.get('http://www.baidu.com').status_code 
def run(): 
    ls = [gevent.spawn(download) for i in range(100)] 
    gevent.joinall(ls) 
def run2(): 
    for i in range(100): 
     download() 
if __name__ == '__main__': 
    from timeit import Timer 
    t = Timer(stmt="run();", setup="from __main__ import run") 
    print('good', t.timeit(3)) 
    t = Timer(stmt="run2();", setup="from __main__ import run2") 
    print('bad', t.timeit(3)) 
    sys.exit(0) 

が、結果は次のとおりです。

good 5.006664161000117 
bad 29.077525214999696 

ので、すべての種類geventでスピードアップすることができが、読み取り、書き込みですか?

PS:私は、Mac /のpython3 /要求にそれを実行してから、2.10.0/gevent 1.1.2

+0

私は 'gevent'にあまり慣れていませんが、I/Oに起因すると思います。 Webリクエストをするとき、サーバーとの接続を確立し、ハンドシェイクを行うなどのオーバーヘッドがあります。これが多くなると、クライアントが応答を待っているアイドル時間が長くなります。アイドル状態の間、 'gevent'は他のリクエストを送信する可能性が非常に高いです。ただし、Pythonのみの実装では、各要求が完了するまで待機してから別の要求を送信します。 –

+0

は理にかなっているので、r'equests.get'は常にブロックしておらず、ブロックすると何か他のことをするgeventに置き換えられます。 ポイントは 'gevent'が'要求 'をどれだけ変更できるかということです。例えば、ほとんどすべての 'urllib'を変更することができます。これはリクエストよりもはるかに速いです。 –

答えて

-1

gevent website

たkqueueにlibevは(Linux上のepollに基づいて、高速イベントループFreeBSD)。

グリーンレットに基づく軽量実行ユニット。

Python標準ライブラリのコンセプトを再利用するAPI(たとえば、gevent.event.Eventsとgevent.queue.Queues)があります。 SSLをサポートして

協調ソケットスレッドプールまたはc-ARESを介して行わ

DNSクエリー。サードパーティのモジュールが

協同組合になるために取得するユーティリティにパッチを適用

猿は基本的には、ちょうどforrequests.get()呼び出しの束をループすることは、あなたがしているという事実のために、よく、forの束をループ遅いですrequests.get()が呼び出されます。 requests.get()コールの呼び出しを停止するのは、スレッドコールのキューにこれらのコールをスローしているため、ジントの強力なAPIを使用してこれらのコールを非常に効率的に実行するためです。

+1

jaあなたの意義はわかっていますが、代わりにスレッドキューにそれらの呼び出しを投げているのですが、ジョブがブロックであれば何も変わらず、一度は1つの仕事をして、仕事は「寝るのが待っています! !彼は仕事が終わるまで動かない。 –

+0

あなたの例では、ブロッキングは実際には何にも影響しません。あなたは 'requests.get()'だけです。本当に。だから、スレッド 'Queue'はgevent /あなたのプロセッサーが許す限り多くのジョブを起動します。 ここで、変数(たとえば、ページテキストに基づく文字列値)を変更すると、GILのためにブロッキングが確実に行われます。 – crashfocus

関連する問題