为什么gevent可以加快下载请求?

时间:2016-07-25 02:30:12

标签: python python-requests gevent

我认为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

上运行它

1 个答案:

答案 0 :(得分:-1)

来自gevent website

  

基于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()次调用并不慢。非常有效地完成这些调用。