为了更方便的配合协程发请求,我们使用 aiohttp 库来代替 requests 库,关于 aiohttp,这里不做过多剖析,仅做下简单介绍 。
aiohttpaiohttp 是 asyncio 和 Python 的异步 HTTP 客户端 / 服务器,由于是异步的,经常用在服务区端接收请求,和客户端爬虫应用,发起异步请求,这里我们主要用来发请求 。
aiohttp 支持客户端和 HTTP 服务器,可以实现单线程并发 IO 操作,无需使用 Callback Hell 即可支持 Server WebSockets 和 Client WebSockets,且具有中间件 。
代码实现直接上代码了,talk is cheap, show me the code~
import aiohttpimport asynciofrom inspect import isfunctionimport timeimport logger@logging_utils.exception(logger)def request(pool, data_list):loop = asyncio.get_event_loop()loop.run_until_complete(exec(pool, data_list))async def exec(pool, data_list):tasks = []sem = asyncio.Semaphore(pool)for item in data_list:tasks.Append(control_sem(sem,item.get("method", "GET"),item.get("url"),item.get("data"),item.get("headers"),item.get("callback")))await asyncio.wait(tasks)async def control_sem(sem, method, url, data, headers, callback):async with sem:count = 0flag = Falsewhile not flag and count < 4:flag = await fetch(method, url, data, headers, callback)count = count + 1print("flag:{},count:{}".format(flag, count))if count == 4 and not flag:raise Exception('EAS service not responding after 4 times of retry.')async def fetch(method, url, data, headers, callback):async with aiohttp.request(method, url=url, data=https://www.isolves.com/it/cxkf/yy/Python/2020-03-05/data, headers=headers) as resp:try:json = await resp.read()print(json)if resp.status != 200:return Falseif isfunction(callback):callback(json)return Trueexcept Exception as e:print(e)
这里,我们封装了对外发送批量请求的 request 方法,接收一次性发送的数据多少,和数据综合,在外部使用时,只需要构建好网络请求对象的数据,设定好请求池大小即可,同时,设置了重试功能,进行了 4 次重试,防止在网络抖动的时候,单个数据的网络请求发送失败 。
最终效果在使用协程重构网络请求模块之后,当数据量在 1000 的时候,由之前的 816s,提升到 424s,快了一倍,且请求池大小加大的时候,效果更明显,由于第三方平台同时建立连接的数据限制,我们设定了 40 的阀值 。可以看到,优化的程度很显著 。
编者说人生苦短,我用 python 。协程好不好,谁用谁知道 。如果有类似的场景,可以考虑启用,或者其他场景,欢迎留言讨论 。
参考资料:本文转载自公众号阿里技术(ID:ali_tech) 。
理解 async/await:
https://segmentfault.com/a/1190000015488033?spm=ata.13261165.0.0.57d41b119Uyp8t
协程概念,原理(c++ 和 node.js 实现)
https://cnodejs.org/topic/58ddd7a303d476b42d34c911?spm=ata.13261165.0.0.57d41b119Uyp8t
原文链接:
https://mp.weixin.qq.com/s/qiO700NZCGabxmfosi6aAQ
推荐阅读
- 如何提高网站的打开速度
- Docker 安装 Nginx、PHP、MySQL、Tomcat、Python、Redis、Apache
- 零信任下的应用安全网关该如何建设?
- Python中with语句是干什么用的?
- 如何模拟超过 5 万用户的并发访问?
- 网络中经常接触的Ping 一次性教你弄懂如何检测三层网络
- led吸顶灯如何正确选购
- 网店宝贝标题如何写 淘宝怎么做标题
- 教您如何轻松撬开普洱茶
- 大蒜如何储存才不易发芽?