V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
RickGray
V2EX  ›  Python

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

  •  
  •   RickGray ·
    RickGray · 2015-10-27 10:55:49 +08:00 · 4136 次点击
    这是一个创建于 3340 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    15 条回复    2015-10-29 13:03:36 +08:00
    est
        1
    est  
       2015-10-27 11:12:13 +08:00
    multiprocessing 貌似是多进程,不是多线程
    felixzhu
        2
    felixzhu  
       2015-10-27 11:14:49 +08:00
    协程吧, gevent 之类的
    shadowmydx
        3
    shadowmydx  
       2015-10-27 11:26:13 +08:00
    Python 之所以引入 multiprocessing ,是因为 Python 有全局解释器锁,不能很好的发挥多 CPU 的计算能力。所以如果有 CPU 密集型的计算任务时,为了发挥多 CPU 的计算能力,就会把计算任务分发到不同的进程中完成。

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

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

    from multiprocessing.dummy import Pool
    leavic
        6
    leavic  
       2015-10-27 12:14:39 +08:00
    网络的异步 io 才是瓶颈, cpu 不是,请考虑 gevent
    Hipponensis
        7
    Hipponensis  
       2015-10-27 12:46:54 +08:00
    asyncio 、 aiohttp
    wencan
        8
    wencan  
       2015-10-27 16:02:10 +08:00
    node 欢迎你
    alexapollo
        9
    alexapollo  
       2015-10-27 16:09:15 +08:00
    asyncio, gevent
    chenwen
        10
    chenwen  
       2015-10-27 16:10:59 +08:00
    协程才是王道
    ericls
        11
    ericls  
       2015-10-28 03:57:03 +08:00
    如果是 python 3 就用 aiohttp 如果是 python2 就用 gevent

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

    现在 gevent 也只是 python3 了
    ryd994
        12
    ryd994  
       2015-10-28 04:09:10 +08:00
    上 gevent ,新手用 monkeypatch 也能有不错的效果(尽管也有概率掉坑就是了)
    northisland
        13
    northisland  
       2015-10-28 15:15:13 +08:00
    请问你的这个
    BANNER = r'''
    _____ _ __ _____
    / ___/(_)___ ___ ____ / /__ / ___/_________ _____
    \__ \/ / __ `__ \/ __ \/ / _ \\__ \/ ___/ __ `/ __ \
    ___/ / / / / / / / /_/ / / __/__/ / /__/ /_/ / / / /
    /____/_/_/ /_/ /_/ .___/_/\___/____/\___/\__,_/_/ /_/
    /_/
    是怎么生成的?
    MrGba2z
        14
    MrGba2z  
       2015-10-28 22:32:52 +08:00
    RickGray
        15
    RickGray  
    OP
       2015-10-29 13:03:36 +08:00 via Android
    @northisland figlet
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1175 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 18:05 · PVG 02:05 · LAX 10:05 · JFK 13:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.