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

2014-08-09 15:49:11 +08:00
 wangfeng3769
最近试了试mutiprocessing,threading ,执行过程中都会无故阻塞,不知道该怎么弄,希望大家推荐一下。
7145 次点击
所在节点    Python
26 条回复
no13bus
2014-08-09 17:05:21 +08:00
threadpool?这个呢?
mengskysama
2014-08-09 17:07:38 +08:00
什么叫无故阻塞。贴代码
est
2014-08-09 17:21:48 +08:00
这怪工具怪得。。。。
wangfeng3769
2014-08-09 19:34:02 +08:00
stackless 完美安装。
skybr
2014-08-09 19:53:26 +08:00
适用场景都不一样的, 你这是乱挖坑跳.
wangfeng3769
2014-08-09 20:08:20 +08:00
http://architects.dzone.com/articles/install-stackless-python 完美安装不影响原来的,但是stackless之后不能import django 等一些第三方库。
@skybr
wangfeng3769
2014-08-09 20:23:47 +08:00
@skybr 希望试一试,确实很爽。但是记住千万别默认安装。
helloworld00
2014-08-09 20:55:26 +08:00
python多线程就是渣。。。
早脱身早幸福

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

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

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

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

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

concurrency这点java确实没得说,cpp都在学java
clino
2014-08-10 19:53:22 +08:00
'执行过程中都会无故阻塞'
觉得楼主应该先弄清楚原因,否则用其他的也可能会碰到的
skybr
2014-08-10 20:40:45 +08:00
@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. 你的信息源是对的, 只不过大致滞后了十年.

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

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

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

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

© 2021 V2EX