关于 Python 「多进程」「异步」
首先声明,不讨论数据爬取的道德&法律问题,只是一个技术上的尝试。
尝试了一下 python 的多进程或者异步 2 中写法发起网络请求,都没问题。
不过,异步的本质还是一个线程在执行,效率虽然已经很高,但是仍然没有发挥多核优势。对于大量的数据,能否多进程+异步完成?
尝试了下,始终没能成功,网上多进程+同步,或者单进程+异步倒是挺多的,但是多进程+异步相关资料比较少,有大神实践过吗。感谢
用到的异步请求库 httpx
----------------------- 以下是精选回复-----------------------
答:一台机器上多个进程,多个机器上多个进程,后者就是所谓的分布式爬虫了,本质还是消息队列转一下
scrapy 里面有 scrapy redis
golang 里面有 colly
答:一个线程同时发几百个上千个异步请求就可以把千兆网卡跑满,IO 密集型瓶颈在网速上,而不是你用的是进程线程还是协程。如果你的任务瓶颈在处理返回的数据上,应该用消息队列这种机制,由一个线程单独发请求,再开多个进程消费它产生的数据
答:任务队列+线程池。或者直接线程池
答:不懂 python ,但是你写一个进程管理器,把网络请求的代码放到 fork 出来的子进程中执行,不就是多进程+异步了吗?
nodejs 很多框架都是这种模式,我感觉 python 应该也有类似的库吧
答:“效率虽然已经很高,但是仍然没有发挥多核优势”,建议重新理解 IO 密集任务的含义。IO 密集场景指的是最终性能表现受限于你的基础设施(软件基础设施,硬件基础设施),你的信息收发模块按照它的设定逻辑,总共只能处理那么多的任务,你 CPU 跑的再快,塞再多任务它也处理不了,有什么用呢?
你可以看到一些 TCP 通信框架跑分,用 C 语言写的框架每秒可以做到几十万次并发,但是 C 语言每秒可以修改 1 亿次三级缓存状态,所以为什么 CPU 跑的比单机通信跑分可以高好几个数量级,单机通信跑分最高还是只有几十万?
答:https://github.com/systemime/YuQue-Assistant/blob/186a73cbcecc84b85638934b31b4badab55c0db2/yuque.py#L266
多进程协程使用
0条评论