requests 模拟请求在gevent和asyncio 中的阻塞问题

在学习asyncio 中,我们发现用 requests包发起http请求时,无法实现异步io。  原因是因为request包 并不是非阻塞的,所以无法实行异步io ,只能使用Python3的aiohttp,或者socket 之类的可以设定为非阻塞的io操作。

但是在看gevent的时候,发现了不同的问题,当我用gevent 使用多个requests 发起http请求时,却实现了异步io。  所以感觉到很奇怪,网上搜到了一些答案, 在此把问题复现,并且给出我认为合理的解释:

代码如下:

from gevent import monkey; monkey.patch_all()
import gevent,requests
import time

def f(url):
    print url

    data = requests.get(url)

    print data

start = time.time()
url_list = []
for i in range(5):
    url_list.append(gevent.spawn(f,'https://www.baidu.com/'))

gevent.joinall(url_list)
print time.time() - start
实现结果   requests 模拟请求在gevent和asyncio 中的阻塞问题_第1张图片


这个结果在asynico 里面不能实现,因为requests 是阻塞的。   所以去搜了下结果  得到这么个解答: 因为gevent 打了个猴子补丁, 然后直接更改了Python 标准库里面的大部分阻塞式系统调用,包括socket,ssl,threading 等等,而变为协作式运行。所以requests 可以在requests里实现异步io.

这个解答的来源为: http://www.jkeabc.com/468800.html

看了这个答案后,感觉明白了什么是猴子补丁,猴子补丁就是像猴子一样突然蹦出来不可控的东西

你可能感兴趣的:(Python)