关于 Python 「多进程」「异步」

2022-04-16 10:39:32 +08:00
 maobukui

首先声明,不讨论数据爬取的道德&法律问题,只是一个技术上的尝试。

尝试了一下 python 的多进程或者异步 2 中写法发起网络请求,都没问题。

不过,异步的本质还是一个线程在执行,效率虽然已经很高,但是仍然没有发挥多核优势。对于大量的数据,能否多进程+异步完成?

尝试了下,始终没能成功,网上多进程+同步,或者单进程+异步倒是挺多的,但是多进程+异步相关资料比较少,有大神实践过吗。感谢

用到的异步请求库 httpx

3040 次点击
所在节点    Python
6 条回复
youngce
2022-04-16 11:13:40 +08:00
一台机器上多个进程,多个机器上多个进程,后者就是所谓的分布式爬虫了,本质还是消息队列转一下

scrapy 里面有 scrapy redis

golang 里面有 colly
ch2
2022-04-16 11:16:21 +08:00
一个线程同时发几百个上千个异步请求就可以把千兆网卡跑满,IO 密集型瓶颈在网速上,而不是你用的是进程线程还是协程。如果你的任务瓶颈在处理返回的数据上,应该用消息队列这种机制,由一个线程单独发请求,再开多个进程消费它产生的数据
htoooth
2022-04-16 11:18:23 +08:00
任务队列+线程池。或者直接线程池
lscho
2022-04-16 11:33:42 +08:00
不懂 python ,但是你写一个进程管理器,把网络请求的代码放到 fork 出来的子进程中执行,不就是多进程+异步了吗?

nodejs 很多框架都是这种模式,我感觉 python 应该也有类似的库吧
LeeReamond
2022-04-16 15:12:15 +08:00
“效率虽然已经很高,但是仍然没有发挥多核优势”,建议重新理解 IO 密集任务的含义。IO 密集场景指的是最终性能表现受限于你的基础设施(软件基础设施,硬件基础设施),你的信息收发模块按照它的设定逻辑,总共只能处理那么多的任务,你 CPU 跑的再快,塞再多任务它也处理不了,有什么用呢?

你可以看到一些 TCP 通信框架跑分,用 C 语言写的框架每秒可以做到几十万次并发,但是 C 语言每秒可以修改 1 亿次三级缓存状态,所以为什么 CPU 跑的比单机通信跑分可以高好几个数量级,单机通信跑分最高还是只有几十万?
opengo
2022-05-01 08:41:08 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847290

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX