我认为requests.get
应该是阻止的,所以run和run2之间应该没有区别。
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 / requests 2.10.0 / gevent 1.1.2
上运行它答案 0 :(得分:-1)
基于libev的快速事件循环(Linux上的epoll,FreeBSD上的kqueue)。
基于greenlet的轻量级执行单元。
重用API标准库中的概念的API(例如,有gevent.event.Events和gevent.queue.Queues)。
支持SSL的协作套接字
通过线程池或c-ares执行的DNS查询。
Monkey修补实用程序,以使第三方模块成为合作
基本上,只有for
循环播放一堆requests.get()
个电话的速度很慢,因为你很好,for
循环了一堆requests.get()
调用。由于您将这些调用放入线程化队列中,然后使用gevent强大的API,因此Gevent大量requests.get()
次调用并不慢。非常有效地完成这些调用。