当前位置:网站首页>协程与多进程的完美结合
协程与多进程的完美结合
2022-04-23 04:26:00 【VIP_CQCRE】
这是「进击的Coder」的第 607 篇技术分享
作者:kingname
来源:未闻 Code
“
阅读本文大概需要 4 分钟。
”我们知道,协程本质上是单线程单进程,通过充分利用 IO 等待时间来实现高并发。在 IO 等待时间之外的代码,还是串行运行的。因此,如果协程非常多,多少每个协程内部的串行代码运行时间超过了 IO 请求的等待时间,那么它的并发就会有一个上限。
举个例子,电饭煲煮饭,洗衣机洗衣服,热水壶烧水,他们都是启动设备以后就能自己运行,我们可以利用他们自己运行的时间,让这三件事情看起来几乎在同时进行。但如果除了这三件事情外,还有开电视,开空调,发微信……等等几十个事情。每个事情单独拿出来确实都只需要做个开头,剩下的就是等,但由于做这个开头也需要时间,因此把他们全部启动起来也要不少时间,你的效率还是被卡住。
现在,如果有两个人一起来做这些事情,那情况就不一样了。一个人煮饭和烧水,另一个人开洗衣机,开电视和空调。效率进一步提升。
这就是协程与多进程的结合,每个进程里面多个协程同时运行,充分利用 CPU 的每一个核心,又充分利用了 IO 等待时间,把 CPU 跑满,把网络带宽跑满。强强联合,速度更快。
有一个第三方库aiomultiprocess
,让你能用几行代码就实现多进程与协程的组合。
首先使用 pip 安装:
python3 -m pip install aiomultiprocess
它的语法非常简单:
from aiomultiprocess import Pool
async with Pool() as pool:
results = await pool.map(协程, 参数列表)
只需要 3 行代码,它就会在你 CPU 上每个核启动一个进程,每个进程中不停启动协程。
我们来写一段实际代码:
import asyncio
import httpx
from aiomultiprocess import Pool
async def get(url):
async with httpx.AsyncClient() as client:
resp = await client.get(url)
return resp.text
async def main():
urls = [url1, url2, url3]
async with Pool() as pool:
async for result in pool.map(get, urls):
print(result) # 每一个URL返回的内容
if __name__ == '__main__':
asyncio.run(main())
之前我写异步协程文章的时候,有些人同学会问我,爬虫的速度真的那么重要吗?难道不是突破反爬虫最重要吗?
我的回答是,不要看到用 aiohttp 请求网址就觉得是做爬虫。在微服务里面,自己请求自己的 HTTP 接口,也需要使用 httpx 或者 aiohttp。在这样的场景里面,速度就是非常的重要,有时候就是需要做到越快越好。
关于aiomultiprocess
的更多使用,可以参阅它的官方文档[1].
参考文献
[1] 官方文档: https://aiomultiprocess.omnilib.dev/en/latest/guide.html
End
崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!
内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍
扫码购买
好文和朋友一起看~
版权声明
本文为[VIP_CQCRE]所创,转载请带上原文链接,感谢
https://blog.csdn.net/u010467643/article/details/124357799
边栏推荐
- [AI vision · quick review of today's sound acoustic papers, issue 2] Fri, 15 APR 2022
- Single chip microcomputer serial port data processing (2) -- ucosiii + cyclic queue receiving data
- AWS EKS添加集群用户或IAM角色
- [echart] démarrer avec echart
- 重剑无锋,大巧不工
- TreeSet after class exercises
- Nel ASA: her ø Ya facility in Norway officially opened
- The latest price trend chart and trading points of London Silver
- io.Platform.packageRoot; // ignore: deprecated_member_use
- Basic introduction to spot gold
猜你喜欢
[AI vision · quick review of robot papers today, issue 31] Fri, 15 APR 2022
MATLAB lit plusieurs diagrammes fig et les combine en un seul diagramme (sous forme de sous - Diagramme)
[AI vision · quick review of NLP natural language processing papers today, No. 32] wed, 20 APR 2022
Second kill all interval related problems
QtSpim手册-中文翻译
[AI vision · quick review of today's sound acoustic papers, issue 2] Fri, 15 APR 2022
Go反射法则
单极性非归零NRZ码、双极性非归零NRZ码、2ASK、2FSK、2PSK、2DPSK及MATLAB仿真
C语言: 指针的进阶
无线充电全国产化电子元件推荐方案
随机推荐
MYSQL去重方法汇总
Xiaomi, which has set the highest sales record of domestic mobile phones in overseas markets, paid renewed attention to the domestic market
Mysql---数据读写分离、多实例
无线充电全国产化电子元件推荐方案
MATLAB lit plusieurs diagrammes fig et les combine en un seul diagramme (sous forme de sous - Diagramme)
从MySQL数据库迁移到AWS DynamoDB
Introduction to Cortex-M3 register set, assembly language and C language interface
Xiaohongshu was exposed to layoffs of 20% as a whole, and the internal volume among large factories was also very serious
TreeSet after class exercises
[AI vision · quick review of robot papers today, issue 29] Mon, 14 Feb 2022
Opencv -- yoact case segmentation model reasoning
电钻、电锤、电镐的区别
【论文阅读】【3d目标检测】Improving 3D Object Detection with Channel-wise Transformer
MYSQL50道基础练习题
Xshell、Xftp连接新创建的Unbutu系统虚拟机全流程
Mysql出现2013 Lost connection to MySQL server during query
基于PHP的代步工具购物商城
VHDL语言实现32位二进制数转BCD码
[AI vision · quick review of today's sound acoustic papers, issue 3] wed, 20 APR 2022
记录一下盲注脚本