我認爲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'可以改變'requests',例如,他可以改變幾乎所有'urllib'.so,這比請求要快得多。 –