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

关于python多线程

  •  
  •   kojp · 2011-11-01 20:51:07 +08:00 · 5603 次点击
    这是一个创建于 4782 天前的主题,其中的信息可能已经有所发展或是发生改变。
    呃,有没有一个上限?或是什么的?

    我写一个超级简单的自动投票程序,
    用了一下多线程。。。从两个到五个到十个。。。越用越爽~~~

    能不能用到100个?200个?
    (好多基础我不懂,都是现用现GOOGLE的,所以如果问题有点不入道,请见谅)
    16 条回复    1970-01-01 08:00:00 +08:00
    keakon
        1
    keakon  
       2011-11-01 20:57:35 +08:00
    上限就是你的内存……

    另外,因为存在GIL,所以Python的多线程只能用于避免IO的等待,无法利用多核CPU的优势
    kojp
        2
    kojp  
    OP
       2011-11-02 08:44:53 +08:00
    @keakon

    谢谢。
    kojp
        3
    kojp  
    OP
       2011-11-02 08:46:19 +08:00
    @keakon
    另:无法利用多核CPU的优势

    那么有什么语言或者工具可以利用到多核CPU的优势吗? 因为,实际条件是,服务器的CPU是6核的。
    Ricepig
        4
    Ricepig  
       2011-11-02 08:49:26 +08:00
    @kojp 你同时跑n个你的程序不就行了。。。
    myrual
        5
    myrual  
       2011-11-02 09:06:24 +08:00
    @kojp 非要榨干多核的cpu的能力的话,可能要看看支持并行计算的语言,也许函数式的语言可以满足需求,如果线程必须依赖io来进行的话,可能提升的空间有限吧。
    est
        6
    est  
       2011-11-02 09:11:03 +08:00
    @kojp stackless python or multiprocessing
    kojp
        7
    kojp  
    OP
       2011-11-02 10:11:59 +08:00
    @Ricepig

    试了。。。(弱弱的再问一句,这个有上限么?同时跑了十个)
    kojp
        8
    kojp  
    OP
       2011-11-02 10:13:23 +08:00
    @est
    还有。stackless python 这么个东东。。? 谢谢。。
    Ricepig
        9
    Ricepig  
       2011-11-02 14:43:54 +08:00
    @kojp 看你的CPU负载,如果都满了,那就没必要多开了

    上限在linux上貌似就是pid上限
    alsotang
        10
    alsotang  
       2011-11-03 22:32:51 +08:00
    投票程序一般都是IO上限,所以没必要去利用多核的优势。你的程序的效率瓶颈在于网络速度,而不是CPU的处理速度。
    我认为楼主的程序开10个程序每个10线程,与1个程序100线程的效率是几乎一致的。
    kojp
        11
    kojp  
    OP
       2011-11-03 23:01:32 +08:00
    @alsotang

    呃,经测试。效率完全是有差别的。。。(也可能是我程序里面没处理好)

    我在程序里面开5个线程,和开10个线程。。以及开20个线程。。。是承一定的规律往下递减的。
    比如说 10个===》100票 20个====>180票。。。50个=====》350票(大概是这么个规律,数据不够准确)


    但是,我要把10个线程的程序同时开上5个的话。。。却基本上是平均的。 5*100=500票
    SkyFvcker
        12
    SkyFvcker  
       2011-11-12 17:08:44 +08:00
    都是GIL惹得,高并发用Erlang,或者用多进程库。在*nix里多进程通信代价是很低的
    dreamersdw
        13
    dreamersdw  
       2011-11-12 18:09:46 +08:00
    Linux 下
    查看线程数限制 cat /proc/kernel/sys/threads-max,我这里是 62274
    查看进程数限制 cat /proc/kernel/sys/pid-max。我这里是 32768

    non-blocking socket 程序通常是简单的,但代价是不得不为每一个 socket 启用单独的线程或进程。如为效率着想可以使用 epoll + non-blocking socket http://scotdoyle.com/python-epoll-howto.html,并且 Python 下还有 Twisted 框架简化这类编程问题 http://twistedmatrix.com/trac/
    kojp
        14
    kojp  
    OP
       2011-11-13 15:44:41 +08:00
    @dreamersdw

    谢谢,可是我竟然,cat 不出来。。那个值。。。
    est
        15
    est  
       2011-11-13 17:57:43 +08:00
    @dreamersdw twisted当真是用来“简化”的?
    dreamersdw
        16
    dreamersdw  
       2011-11-14 08:53:30 +08:00
    @kojp OMG, 写反了,应当是 cat /proc/sys/kernel/threads-max
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5025 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:54 · PVG 11:54 · LAX 19:54 · JFK 22:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.