11
我注意到Gevent有线程池对象。 有人可以向我解释何时使用线程池以及何时使用常规池? gevent.threadpool和gevent.pool有什么区别?何时使用Gevent中的线程池
我注意到Gevent有线程池对象。 有人可以向我解释何时使用线程池以及何时使用常规池? gevent.threadpool和gevent.pool有什么区别?何时使用Gevent中的线程池
当你有一段需要很长时间才能运行(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
“但我相信,如果你的代码花费了大量的时间在AC库将有没有效果“你确定吗?你是指C扩展还是'ctypes'?因为如果你释放GIL(手动使用C扩展或自动使用'ctypes'),那么应用程序将受益于ThreadPool,不是吗? – MariusSiuram
是的。 “如果你释放GIL”。我没有时间从每个C库文件中找出它 – Stephan