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
MrGba2z
V2EX  ›  Python

关于 Python 多线程效率问题

  •  
  •   MrGba2z · 2015-02-26 14:16:49 +08:00 · 5302 次点击
    这是一个创建于 3565 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我这里想问的是 如果我单线程处理单个需要大概20分钟的话

    现在处理100个.

    是开100个线程好吗?还是开20个 每个线程处理5个. 有区别吗?

    当然我知道Python的多线程是伪 但我暂时没时间去用别的语言写之类的.

    就我的问题而讨论好了.

    当然有比较方便优化Python脚本性能的办法, 也请不吝赐教.

    Thanks in advance.
    18 条回复    2015-04-01 13:39:56 +08:00
    way2exluren
        1
    way2exluren  
       2015-02-26 14:31:03 +08:00 via Android   ❤️ 1
    如果时间消耗在cpu上,那么python的多线程是不能提高效率的……如果是io,应该能提高点效率。
    leozy2014
        2
    leozy2014  
       2015-02-26 14:34:31 +08:00
    不懂程序,lz可以测试下就知道选哪个好了
    MrGba2z
        3
    MrGba2z  
    OP
       2015-02-26 14:35:13 +08:00
    @way2exluren

    Sad....就是消耗在cpu上,
    意思是单线程和二十线程没啥区别么....
    mhycy
        4
    mhycy  
       2015-02-26 14:38:30 +08:00
    @MrGba2z
    建议多进程解决,如果瓶颈是CPU,那么单一的Python进程最多只能充分利用单一核心的处理能力。
    所以100线程和20线程区别不大

    建议把消耗CPU的业务分离出来使用多进程解决
    那么进程数等于CPU核心数就好了
    MrGba2z
        5
    MrGba2z  
    OP
       2015-02-26 14:48:25 +08:00
    @mhycy

    请问是和线程数相同还是核心数相同?

    比如15MBP r 是四核八线程的吧,

    我应该开8线程处理 对吗?
    virusdefender
        6
    virusdefender  
       2015-02-26 14:48:39 +08:00
    楼上说的对 要考虑是io密集型还是cpu密集型
    mhycy
        7
    mhycy  
       2015-02-26 14:50:45 +08:00   ❤️ 1
    @MrGba2z
    开8进程(注意是进程,不是线程)
    neutrino
        8
    neutrino  
       2015-02-26 14:52:15 +08:00
    @MrGba2z 不,开4线程就可以了,最多跑的时候看一下CPU线程分配。
    way2exluren
        9
    way2exluren  
       2015-02-26 14:52:23 +08:00
    具体开多少个进程,要实测一下比较好。
    cpu有多少“线程”,就开几个进程。
    MrGba2z
        10
    MrGba2z  
    OP
       2015-02-26 14:52:47 +08:00
    @mhycy

    明白了 谢谢!
    ericyue
        11
    ericyue  
       2015-02-26 14:57:58 +08:00
    python没有严格意义的线程吧 还不如多进程快
    hahastudio
        12
    hahastudio  
       2015-02-26 15:13:25 +08:00   ❤️ 1
    multiprocessing.Pool(processes=multiprocessing.cpu_count())
    nomaka
        13
    nomaka  
       2015-02-26 15:14:46 +08:00
    @MrGba2z 8进程 然后里面再开个线程池 这样效率会好一点
    xdeng
        14
    xdeng  
       2015-02-26 15:16:00 +08:00
    其实你可以 看cpu 使用率
    zerh925
        15
    zerh925  
       2015-02-26 15:26:56 +08:00   ❤️ 1
    cpu密集型:multiprocessing
    io密集型:multithreading
    mathgl
        16
    mathgl  
       2015-02-26 19:00:57 +08:00 via Android   ❤️ 1
    如果你的代码只是单纯的计算,可以用lupa。在python调用luajit。这样可以用线程,绕过gil。
    min
        17
    min  
       2015-02-26 20:43:16 +08:00 via iPhone
    跑两遍就知道的事情,试验出来自己回答吧
    ming2281
        18
    ming2281  
       2015-04-01 13:39:56 +08:00
    我一般倾向于使用多进程,进程数==CPU核心数,再管理好进程间通信
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1717 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:01 · PVG 08:01 · LAX 16:01 · JFK 19:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.