Python学习---IO的异步[gevent+Grequests模块]
Posted 小a玖拾柒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习---IO的异步[gevent+Grequests模块]相关的知识,希望对你有一定的参考价值。
安装gevent模块
pip3 install gevent
Gevent实例
import gevent import requests from gevent import monkey # socket发送请求以后就会进入等待状态,gevent更改了这个机制 # socket.setblocking(False) -->发送请求后就不会等待服务器响应 monkey.patch_all() # 找到内置的socket并更改为gevent自己的东西 def fetch_async(method, url, req_kwargs): print(method, url, req_kwargs) response = requests.request(method=method, url=url, **req_kwargs) print(response.url, response.content) # ##### 发送请求 ##### gevent.joinall([ # 这里spawn是3个任务[实际是3个协程],每个任务都会执行fetch_async函数 gevent.spawn(fetch_async, method=\'get\', url=\'https://www.python.org/\', req_kwargs={}), gevent.spawn(fetch_async, method=\'get\', url=\'https://www.yahoo.com/\', req_kwargs={}), gevent.spawn(fetch_async, method=\'get\', url=\'https://github.com/\', req_kwargs={}), ])
Gevent也是支持协程池
##### 发送请求(协程池控制最大协程数量) ##### # 也可以理解为先最大发送2个请求,2个请求结束后发送第三个请求 from gevent.pool import Pool pool = Pool(2) # 最多执行2个协程序,None表示不设置限制 gevent.joinall([ pool.spawn(fetch_async, method=\'get\', url=\'https://www.python.org/\', req_kwargs={}), pool.spawn(fetch_async, method=\'get\', url=\'https://www.yahoo.com/\', req_kwargs={}), pool.spawn(fetch_async, method=\'get\', url=\'https://www.github.com/\', req_kwargs={}), ])
Grequests
安装grequests
pip3 install grequests
grequests实际上就是封装了gevent里面的方法,然后配合requests实现异步的IO
grequests = gevent + request
grequests.map() 内部实现
Grequest实例
import grequests # 实际上就是requests + gevent request_list = [ # 发送get请求 grequests.get(\'https://www.baidu.com/\', timeout=10.001), grequests.get(\'https://www.taobao.com/\'), grequests.get(\'https://hao.360.cn/\') ] # ##### 执行并获取响应列表 ##### response_list = grequests.map(request_list) # 实际上内部循环执行gevent内部的joinall()方法 print(response_list) # ##### 执行并获取响应列表(处理异常) ##### # def exception_handler(request, exception): # print(request,exception) # print("Request failed") # response_list = grequests.map(request_list, exception_handler=exception_handler) # print(response_list)
以上是关于Python学习---IO的异步[gevent+Grequests模块]的主要内容,如果未能解决你的问题,请参考以下文章
# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # SelectPollEpoll异步IO 以及selectors模块 # (示