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

python 下的多线程选哪个比较好?

  •  1
     
  •   wangfeng3769 · 2014-08-09 15:49:11 +08:00 · 6361 次点击
    这是一个创建于 2629 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近试了试mutiprocessing,threading ,执行过程中都会无故阻塞,不知道该怎么弄,希望大家推荐一下。
    26 条回复    2014-08-13 14:16:41 +08:00
    no13bus
        1
    no13bus   2014-08-09 17:05:21 +08:00
    threadpool?这个呢?
    mengskysama
        2
    mengskysama   2014-08-09 17:07:38 +08:00
    什么叫无故阻塞。贴代码
    est
        3
    est   2014-08-09 17:21:48 +08:00 via Android
    这怪工具怪得。。。。
    wangfeng3769
        4
    wangfeng3769   2014-08-09 19:34:02 +08:00
    stackless 完美安装。
    skybr
        5
    skybr   2014-08-09 19:53:26 +08:00
    适用场景都不一样的, 你这是乱挖坑跳.
    wangfeng3769
        6
    wangfeng3769   2014-08-09 20:08:20 +08:00
    http://architects.dzone.com/articles/install-stackless-python 完美安装不影响原来的,但是stackless之后不能import django 等一些第三方库。
    @skybr
    wangfeng3769
        7
    wangfeng3769   2014-08-09 20:23:47 +08:00
    @skybr 希望试一试,确实很爽。但是记住千万别默认安装。
    helloworld00
        8
    helloworld00   2014-08-09 20:55:26 +08:00
    python多线程就是渣。。。
    早脱身早幸福

    多线程部分用java最方便
    skybr
        9
    skybr   2014-08-09 20:57:44 +08:00   ❤️ 2
    @wangfeng3769

    我总结一下吧
    multiprocessing是python封装的包含了调用和进程间通讯的多进程类库, 无论密集型运算还是IO堵塞都能用, 副作用小, 但最重.

    threading是基于系统级的线程调用, 适用的场合通常是IO堵塞, 密集型运算由于GIL,纯Python的运算和一部分没在底层释放GIL的C/C++库无法有效利用多核.

    stackless仅仅只是协程, 既不能处理密集型运算的堵塞, 也不能处理IO的堵塞, 该怎么堵塞还得怎么堵塞, 只是开销比线程小. stackless近年来少人用是因为许多年前就单独搞了个cPython下能直接用的py.greenlet, 后来又独立成greenlet包, 而后多年前基于greenlet和异步库的几个高级封装库如eventlet和gevent能处理一部分IO堵塞场景.

    你这帖列举的三个库的用途是完全不一样的.
    wangfeng3769
        10
    wangfeng3769   2014-08-09 22:08:46 +08:00
    @skybr
    说实话threading<mutiprocessing(速度)< stackless,说真的stackless的速度还是不错的。
    mengskysama
        11
    mengskysama   2014-08-10 02:22:45 +08:00
    反正PY都没办法利用多核,但是gevent能保证资源独立,协程数量上去之后代价明显线程要小。thread开发线程间无逻辑关系并且有阻塞情况发生的时候代码应该比协程要少很多。协程都得做成异步回调的,有时候会很蛋疼,特别是业务逻辑多的时候可能会挂上很多回调。协程的确是个好东西。
    20150517
        12
    20150517   2014-08-10 07:36:37 +08:00
    twisted
    wangfeng3769
        13
    wangfeng3769   2014-08-10 08:08:07 +08:00
    很多游戏都是stackless做的,只想说一句stackless 如果那么渣的话,早就完蛋了。
    yuelang85
        14
    yuelang85   2014-08-10 10:00:39 +08:00
    我觉得楼主最起码应该搞清楚到底啥是线程
    Zuckonit
        15
    Zuckonit   2014-08-10 11:42:04 +08:00
    如果是IO密集型, 果断gevent吧
    wangfeng3769
        16
    wangfeng3769   2014-08-10 11:46:03 +08:00
    @Zuckonit
    @yuelang85
    是的,以前用gevent 但是机子不好使,只能stackless 跑一阵子吧.
    P9
        17
    P9   2014-08-10 14:22:18 +08:00
    @helloworld00 py3有改进。
    helloworld00
        18
    helloworld00   2014-08-10 18:06:06 +08:00
    @P9 那legacy code如果是2.7x 不还是得改,还不如趁机直接改成java拥抱新世界。。。

    concurrency这点java确实没得说,cpp都在学java
    clino
        19
    clino   2014-08-10 19:53:22 +08:00 via Android
    '执行过程中都会无故阻塞'
    觉得楼主应该先弄清楚原因,否则用其他的也可能会碰到的
    skybr
        20
    skybr   2014-08-10 20:40:45 +08:00   ❤️ 3
    @wangfeng3769

    书接上回

    我再说直白点吧

    stackless既不是进程也不是线程, 只是协程, 用来切换context的, 和greenlet或python新内置的yield from大致相仿, 并不具备进程或线程具备的任何并发或者并行运算能力.

    python因为GIL, 对于纯py运算或者没释放GIL的扩展无法有效利用多核, 所以Python的线程主要用途就是处理IO堵塞问题. 基于这个前提, 通常说的Python用"协程库代替线程"指的是*异步协程库*(如eventlet、gevent或者yield from + asyncio, 或者类似twisted或tornado)代替多线程处理*部分IO操作*实现并发(本地文件的读写或者sock隐藏在C/C++库里没暴露接口是替代不了的), 你指望没有异步IO的封装, 单靠stackless来替代多线程就好像指望拿着一扇车窗代步一样.


    stackless少人用无关渣不渣, 而是stackless已经释出了cPython下能用的greenlet模块, 比起装一个stackless python, pip install greenlet轻量方便得多. second life一直被作为拿stackless做游戏的代表, 而其在七八年前就放出了主要基于greenlet的异步协程库eventlet(也能在stackless下运行, 但是是把stackless封装成greenlet的接口实现的), 国内的沈游侠六七年前启动
    eurasia项目, 之后火速把一开始用的stackless换成了greenlet. 你的信息源是对的, 只不过大致滞后了十年.
    P9
        21
    P9   2014-08-11 09:39:10 +08:00
    @helloworld00 恩,java当然有自己的独到之处。
    lianghui
        22
    lianghui   2014-08-11 10:52:04 +08:00
    多线程有助于io集中型, 如果多线程没有办法完成任务,又想使用把多核使用起来,那就fork吧。
    jamiesun
        23
    jamiesun   2014-08-11 13:28:31 +08:00
    用 jython 吧
    wangfeng3769
        24
    wangfeng3769   2014-08-11 14:12:18 +08:00
    @skybr 面对技术牛,我只能说一句,文档没有好好读,没有好好对比,坑还是得自己填上以后多研究吧。
    nomaka
        25
    nomaka   2014-08-13 12:59:52 +08:00
    有GIL某些操作线程肯定会阻塞,多线程只能解决io等待等问题,要密集计算的 lz果断换进程吧
    wangfeng3769
        26
    wangfeng3769   2014-08-13 14:16:41 +08:00
    @nomaka
    已经又回到了 mutiprocess上了。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3706 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:32 · PVG 09:32 · LAX 18:32 · JFK 21:32
    ♥ Do have faith in what you're doing.