当前位置:网站首页>协程与多进程的完美结合
协程与多进程的完美结合
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
边栏推荐
- Bacterial infection and antibiotic use
- TreeSet课后练习
- UDP协议与TCP协议
- KVM error: Failed to connect socket to ‘/var/run/libvirt/libvirt-sock‘
- [AI vision · quick review of robot papers today, issue 31] Fri, 15 APR 2022
- Gut liver axis: host microbiota interaction affects hepatocarcinogenesis
- VHDL语言实现32位二进制数转BCD码
- MATLAB lit plusieurs diagrammes fig et les combine en un seul diagramme (sous forme de sous - Diagramme)
- Unipolar NRZ code, bipolar NRZ code, 2ASK, 2FSK, 2PSK, 2DPSK and MATLAB simulation
- PHP export excel table
猜你喜欢
Cortex-M3寄存器组、汇编语言与C语言的接口介绍
Difference between LabVIEW small end sequence and large end sequence
【ICCV 2019】MAP-VAE:Multi-Angle Point Cloud-VAE: Unsupervised Feature Learning for 3D Point Clouds..
Xiaomi, qui a établi le plus grand volume de ventes de téléphones portables domestiques sur le marché d'outre - mer, se concentre de nouveau sur le marché intérieur
STM32单片机ADC规则组多通道转换-DMA模式
VSCode配置之Matlab极简配置
创下国产手机在海外市场销量最高纪录的小米,重新关注国内市场
Express中间件②(中间件的分类)
Unipolar NRZ code, bipolar NRZ code, 2ASK, 2FSK, 2PSK, 2DPSK and MATLAB simulation
洛谷P1858 【多人背包】 (背包求前k优解)
随机推荐
Matlab reads multiple fig graphs and then combines them into one graph (in the form of sub graph)
MYSQL查询至少连续n天登录的用户
中国移动日赚2.85亿很高?其实是5G难带来更多利润,那么钱去哪里了?
QtSpim手册-中文翻译
Xiaomi, qui a établi le plus grand volume de ventes de téléphones portables domestiques sur le marché d'outre - mer, se concentre de nouveau sur le marché intérieur
[latex] formula group
C语言: 指针的进阶
使用大华设备开发行AI人流量统计出现时间不正确的原因分析
【Echart】echart 入门
Bacterial infection and antibiotic use
C language character constant
【BIM+GIS】ArcGIS Pro2.8如何打开Revit模型,BIM和GIS融合?
Hard core chip removal
指纹Key全国产化电子元件推荐方案
Network principle | connection management mechanism in TCP / IP important protocol and core mechanism
Second kill all interval related problems
Bridge between ischemic stroke and intestinal flora: short chain fatty acids
[AI vision · quick review of today's sound acoustic papers, issue 2] Fri, 15 APR 2022
STM32上μC/Shell移植与应用
递归调用--排列的穷举