Python 如何解决 多线程 (multiprocessing) 处理网络请求密集型任务时 低效的问题

2015 年 10 月 27 日
 RickGray

最近,根据学弟的一个小提议,写了一个基于 404 模版的 网站敏感信息扫描的程序。
项目在这里: https://github.com/RickGray/simplescan
但是,直接用 multiprocessing 中的多线程来进行处理,好怎想效率并不么高。
想问问大家遇到这种网络请求密集型任务时都是怎么处理的。

4979 次点击
所在节点    Python
15 条回复
est
2015 年 10 月 27 日
multiprocessing 貌似是多进程,不是多线程
felixzhu
2015 年 10 月 27 日
协程吧, gevent 之类的
shadowmydx
2015 年 10 月 27 日
Python 之所以引入 multiprocessing ,是因为 Python 有全局解释器锁,不能很好的发挥多 CPU 的计算能力。所以如果有 CPU 密集型的计算任务时,为了发挥多 CPU 的计算能力,就会把计算任务分发到不同的进程中完成。

问题在于,网络请求密集型的任务不属于 CPU 密集型而属于 I/O 阻塞型,这个时候,多 CPU 对于任务完成的加力并不明显,而进程的开销反而会拖累程序的效率。所以此时可以选用多线程的方案,来减少新建进程的开销和进程间通信的开销。

题外话,在没看到效率显著提升时,不妨线程开多点。
我 15 个线程跑一个任务,感觉龟速。开到 30 后就刷屏了。
junnplus
2015 年 10 月 27 日
除了网络延迟之外,多线程就取决于 cpu 核数了
RickGray
2015 年 10 月 27 日
@est multiprocessing 中有 多线程实现

from multiprocessing.dummy import Pool
leavic
2015 年 10 月 27 日
网络的异步 io 才是瓶颈, cpu 不是,请考虑 gevent
Hipponensis
2015 年 10 月 27 日
asyncio 、 aiohttp
wencan
2015 年 10 月 27 日
node 欢迎你
alexapollo
2015 年 10 月 27 日
asyncio, gevent
chenwen
2015 年 10 月 27 日
协程才是王道
ericls
2015 年 10 月 28 日
如果是 python 3 就用 aiohttp 如果是 python2 就用 gevent

顺便提一下, requests 有个 版本叫 grequests 同一个作者 用起来不错

现在 gevent 也只是 python3 了
ryd994
2015 年 10 月 28 日
上 gevent ,新手用 monkeypatch 也能有不错的效果(尽管也有概率掉坑就是了)
northisland
2015 年 10 月 28 日
请问你的这个
BANNER = r'''
_____ _ __ _____
/ ___/(_)___ ___ ____ / /__ / ___/_________ _____
\__ \/ / __ `__ \/ __ \/ / _ \\__ \/ ___/ __ `/ __ \
___/ / / / / / / / /_/ / / __/__/ / /__/ /_/ / / / /
/____/_/_/ /_/ /_/ .___/_/\___/____/\___/\__,_/_/ /_/
/_/
是怎么生成的?
v2gba
2015 年 10 月 28 日
RickGray
2015 年 10 月 29 日
@northisland figlet

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

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

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

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

© 2021 V2EX