本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2022-04-20 | 编程技术 | 1495 次阅读 | 等你评论 | 0 次点赞 | 繁体

我们知道,协程本质上是单线程单进程,通过充分利用 IO 等待时间来实现高并发。在 IO 等待时间之外的代码,还是串行运行的。因此,如果协程非常多,多少每个协程内部的串行代码运行时间超过了 IO 请求的等待时间,那么它的并发就会有一个上限。

图片alt

举个例子,电饭煲煮饭,洗衣机洗衣服,热水壶烧水,他们都是启动设备以后就能自己运行,我们可以利用他们自己运行的时间,让这三件事情看起来几乎在同时进行。但如果除了这三件事情外,还有开电视,开空调,发微信……等等几十个事情。每个事情单独拿出来确实都只需要做个开头,剩下的就是等,但由于做这个开头也需要时间,因此把他们全部启动起来也要不少时间,你的效率还是被卡住。

现在,如果有两个人一起来做这些事情,那情况就不一样了。一个人煮饭和烧水,另一个人开洗衣机,开电视和空调。效率进一步提升。

这就是协程与多进程的结合,每个进程里面多个协程同时运行,充分利用 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 的更多使用,可以参阅它的官方文档 https://aiomultiprocess.omnilib.dev/en/latest/guide.html

via:
一日一技:协程与多进程的完美结合
https://mp.weixin.qq.com/s/KQVhjOzn_m-pSl-wpJPCAw

标签: python加速模块

猜你喜欢
局域内网的服务器利用个人电脑做跳板机访问互联网
公司内网的服务器均不连公网(互联网),问题来了:现在服务器上需要安装一些软件怎么办?目前一般都是编译安装!先将软件在外网机器上下载好,然后再复制到服务器内,编译安装!这种方式缺点就是比较麻烦,编...
Python小技巧之不用GUI,照样实现图形界面
小王平常的工作是做数据处理的,手中自然握有大量的数据,在日常工作中经常需要根据业务的需求提取相应的数据,有些需求是固定的,写好脚本之后只要定期提取数据就行了。但是,像我这么懒的人,这种工作怎么可...
为什么网站知道我的爬虫使用了代理?
经常有朋友问:为什么自己的爬虫明明设置了代理,但一访问网站就能被发现。我总结了几种常见的情况。实际上,网站要识别你是否使用了代理,并不一定非要什么高深的反爬虫机制,也不需要使用 AI 识别用户行...
三行代码捅穿 CloudFlare 的五秒盾
经常写爬虫的同学,肯定知道 CloudFlare 的五秒盾。当你没有使用正常的浏览器访问网站的时候,它会返回如下这段文字:Checking your browser before accessi...
loguru 简单方便的 Python 日志记录管理模块
# 这是个啥? 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样。在使用时我们需要配置一些 Handler、Formatter 来进行一
别再用PS了,教你用五行Python代码实现批量抠图
对于会 PhotoShop 的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图。不过对于一些比较复杂的图,有时候还是需要花点时间的,今天就给大家带了一个非常快速简单的办法,用 Python
Excel 打开 CSV 文件乱码解决方法
经常接触数据的朋友,可能时不时会遇到这种情况,一份 CSV 或者 TXT 文件,使用 Excel 打开后就乱码了,但是使用文本方式(比如使用自带记事本)打开又是正常的,遇到这种情况怎么解决呢?
(首次提交评论需审核通过才会显示,请勿重复提交)