我对于asyncio的了解是 通过await去处理阻塞的corountines,直接处理下一个消息,但因为不是多线程,感觉还是在一个一个处理啊,为什么会比multithread速度快呢?
比如:
Number of Process Multiprocessing Asyncio
2 25.5s 7.5s
4 15.4s 7.0s
8 11.5s 7.2s
回答问题 的 注意下素质好么 不用无聊灌水浪费大家时间
莫凡python asyncio教程那边过来的吧?
我这两天也在学习asyncio,之前都是用threading写爬虫,刚拿我之前的一个贴吧爬虫的需求尝试了一下,确实是快,爬某吧会员列表,协程的速度比我线程的速度要快好几倍:
协程与多线程速度对比1
(测试1,爬1000张页面。aio.py脚本是协程;asy2.py脚本是多线程,线程数是15)
协程与多线程速度对比2
(测试2,爬10000张页面。aio.py脚本是协程;asy2.py脚本是多线程,线程数是100)
至于为什么快,我的理解是,协程更适合高IO操作,低计算密集的程序,而爬虫本质上其实都是IO操作(请求网络内容并下载是网络IO,下载下来并写入硬盘也是本地IO)。
而多线程之所以在这方面没有协程快,主要是因为:
线程开销更大(主要在于占用cpu资源,以及多线程之间上下文切换的开销,参考:多线程的线程开销)
而实际上爬虫在干什么呢?不停下载数据而已,基本都不需要cpu计算,所以要cpu的开销做什么呢?
最后再来看一下跑2个脚本时我的电脑资源占用对比:
跑协程时
跑多线程(线程数100)时
所以为什么协程快?这就一目了然了。
(P.S. 用asyncio需要确保写对了才行,不然可能会反而比多线程慢,要注意。这方面我也还在学习中。)