2013-08-23 130 views

回答

9

当你有一段需要很长时间才能运行(python)的代码并且不会引起greenlet的切换。 (没有联网)所有其他greenlet/gevent工作将'挨饿',并没有计算时间,它会看起来像你的应用程序'挂起'。

如果你把这个'繁重'的任务放在一个线程池中,线程执行将确保其他greenlet不会饿死。但我相信如果你的代码在c库中花费了很多时间,它将不会起作用。

下面的例子是gevent examples。请注意,该示例使用time.sleep,其中block而不是gevent.sleep。

提示: 如果你有一个循环,需要较长的时间来运行比你可以把在环路gevent.sleep(0)。每个循环其他greenlet将有机会运行。该GEVENT。睡眠(0),在你慢循环将确保其他greenlets不会饿死和应用出现响应

import time 
import gevent 
from gevent.threadpool import ThreadPool 


pool = ThreadPool(3) 
start = time.time() 
for _ in xrange(4): 
    pool.spawn(time.sleep, 1) 
gevent.wait() 
delay = time.time() - start 
print 'Running "time.sleep(1)" 4 times with 3 threads. Should take about 2 seconds: %.3fs' % delay 
+0

“但我相信,如果你的代码花费了大量的时间在AC库将有没有效果“你确定吗?你是指C扩展还是'ctypes'?因为如果你释放GIL(手动使用C扩展或自动使用'ctypes'),那么应用程序将受益于ThreadPool,不是吗? – MariusSiuram

+0

是的。 “如果你释放GIL”。我没有时间从每个C库文件中找出它 – Stephan