Gor*_*nek 15 python threadpool gevent
我注意到Gevent有线程池对象.有人可以向我解释何时使用线程池以及何时使用常规池?什么是gevent.threadpool和gevent.pool之间的区别?
Ste*_*han 12
当你有一段python代码需要很长时间才能运行(秒)并且不会导致greenlets的转换.(没有网络)所有其他greenlets/gevent工作将'饿死'并且没有计算时间,它看起来像你的应用程序'挂起'.
如果你将这个"重"任务放在Threadpool中,那么线程执行将确保其他greenlet不会饿死.但我相信如果你的代码在ac库中花费了很多时间,它将没有任何效果.
以下是gevent示例的示例.请注意,该示例使用time.sleep来阻止而不是gevent.sleep.
提示:如果你有一个循环需要很长时间才能运行,你可以在循环中放入gevent.sleep(0).每个循环其他greenlets都有机会运行.缓慢循环中的gevent .sleep(0)将确保其他greenlet不会饿死,应用程序显示响应
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
Run Code Online (Sandbox Code Playgroud)