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
实现结果  


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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值