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