私は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
私は 'gevent'にあまり慣れていませんが、I/Oに起因すると思います。 Webリクエストをするとき、サーバーとの接続を確立し、ハンドシェイクを行うなどのオーバーヘッドがあります。これが多くなると、クライアントが応答を待っているアイドル時間が長くなります。アイドル状態の間、 'gevent'は他のリクエストを送信する可能性が非常に高いです。ただし、Pythonのみの実装では、各要求が完了するまで待機してから別の要求を送信します。 –
は理にかなっているので、r'equests.get'は常にブロックしておらず、ブロックすると何か他のことをするgeventに置き換えられます。 ポイントは 'gevent'が'要求 'をどれだけ変更できるかということです。例えば、ほとんどすべての 'urllib'を変更することができます。これはリクエストよりもはるかに速いです。 –