在学习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实现结果
这个结果在asynico 里面不能实现,因为requests 是阻塞的。 所以去搜了下结果 得到这么个解答: 因为gevent 打了个猴子补丁, 然后直接更改了Python 标准库里面的大部分阻塞式系统调用,包括socket,ssl,threading 等等,而变为协作式运行。所以requests 可以在requests里实现异步io.
这个解答的来源为: http://www.jkeabc.com/468800.html
看了这个答案后,感觉明白了什么是猴子补丁,猴子补丁就是像猴子一样突然蹦出来不可控的东西