当前位置: 首页 > 科技观察

协程与多进程的完美结合

时间:2023-03-13 22:47:44 科技观察

我们知道协程本质上是单线程单进程的,通过充分利用IO等待时间实现高并发。IO等待时间之外的代码依然串行运行。所以,如果协程很多,每个协程内部的串行代码运行时间超过IO请求等待时间的多少,那么它的并发度就会有一个上限。比如电饭煲煮饭,洗衣机洗衣服,水壶烧水。它们都可以在启动设备后自行运行。我们可以利用自己的运行时间,让这三件事看起来几乎同时发生。但如果除了这三件事情,还有开电视、开空调、发微信……等几十件事情。诚然,你只需要分别启动每个东西,剩下的就是等待,但是既然开始是??需要时间的,那么全部启动起来会耗费很多时间,你的效率还是会卡住。现在,如果有两个人一起做这些事情,那就是另一回事了。一个人做饭烧水,一个人打开洗衣机、电视和空调。效率进一步提高。这是协程和多进程的结合。每个进程中的多个协程同时运行,充分利用CPU的各个核心,充分利用IO等待时间,充分运行CPU和网络带宽。强强联合,速度更快。有一个第三方库aiomultiprocess,可以让你用几行代码实现多进程和协程的结合。首先使用pip安装:python3-mpipinstallaiomultiprocess语法很简单:fromaiomultiprocessimportPoolasyncwithPool()aspool:results=awaitpool.map(coroutine,parameterlist)只需要3行代码,就可以了在您的CPU上为每个内核启动一个进程,并在每个进程中启动协程。让我们写一段实际的代码:[url1,url2,url3]asyncwithPool()aspool:asyncforresultinpool.map(get,urls):print(result)#每个URL返回的内容if__name__=='__main__':asyncio.run(main())之前写异步协程文章的时候,有同学会问我,爬虫的速度真的那么重要吗?突破反爬虫不是最重要的吗?我的回答是,看不到使用aiohttprequest的网站感觉像爬虫。在微服务中,如果请求自己的HTTP接口,也需要使用httpx或者aiohttp。在这样的场景中,速度是非常重要的,有时候需要越快越好。