1
no13bus 2014-08-09 17:05:21 +08:00
threadpool?这个呢?
|
2
mengskysama 2014-08-09 17:07:38 +08:00
什么叫无故阻塞。贴代码
|
3
est 2014-08-09 17:21:48 +08:00 via Android
这怪工具怪得。。。。
|
4
wangfeng3769 OP stackless 完美安装。
|
5
skybr 2014-08-09 19:53:26 +08:00
适用场景都不一样的, 你这是乱挖坑跳.
|
6
wangfeng3769 OP http://architects.dzone.com/articles/install-stackless-python 完美安装不影响原来的,但是stackless之后不能import django 等一些第三方库。
@skybr |
7
wangfeng3769 OP @skybr 希望试一试,确实很爽。但是记住千万别默认安装。
|
8
helloworld00 2014-08-09 20:55:26 +08:00
python多线程就是渣。。。
早脱身早幸福 多线程部分用java最方便 |
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堵塞场景. 你这帖列举的三个库的用途是完全不一样的. |
10
wangfeng3769 OP @skybr
说实话threading<mutiprocessing(速度)< stackless,说真的stackless的速度还是不错的。 |
11
mengskysama 2014-08-10 02:22:45 +08:00
反正PY都没办法利用多核,但是gevent能保证资源独立,协程数量上去之后代价明显线程要小。thread开发线程间无逻辑关系并且有阻塞情况发生的时候代码应该比协程要少很多。协程都得做成异步回调的,有时候会很蛋疼,特别是业务逻辑多的时候可能会挂上很多回调。协程的确是个好东西。
|
12
20150517 2014-08-10 07:36:37 +08:00
twisted
|
13
wangfeng3769 OP 很多游戏都是stackless做的,只想说一句stackless 如果那么渣的话,早就完蛋了。
|
14
yuelang85 2014-08-10 10:00:39 +08:00
我觉得楼主最起码应该搞清楚到底啥是线程
|
15
Zuckonit 2014-08-10 11:42:04 +08:00
如果是IO密集型, 果断gevent吧
|
16
wangfeng3769 OP |
17
P9 2014-08-10 14:22:18 +08:00
@helloworld00 py3有改进。
|
18
helloworld00 2014-08-10 18:06:06 +08:00
|
19
clino 2014-08-10 19:53:22 +08:00 via Android
'执行过程中都会无故阻塞'
觉得楼主应该先弄清楚原因,否则用其他的也可能会碰到的 |
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. 你的信息源是对的, 只不过大致滞后了十年. |
21
P9 2014-08-11 09:39:10 +08:00
@helloworld00 恩,java当然有自己的独到之处。
|
22
lianghui 2014-08-11 10:52:04 +08:00
多线程有助于io集中型, 如果多线程没有办法完成任务,又想使用把多核使用起来,那就fork吧。
|
23
jamiesun 2014-08-11 13:28:31 +08:00
用 jython 吧
|
24
wangfeng3769 OP @skybr 面对技术牛,我只能说一句,文档没有好好读,没有好好对比,坑还是得自己填上以后多研究吧。
|
25
nomaka 2014-08-13 12:59:52 +08:00
有GIL某些操作线程肯定会阻塞,多线程只能解决io等待等问题,要密集计算的 lz果断换进程吧
|
26
wangfeng3769 OP @nomaka
已经又回到了 mutiprocess上了。 |