我注意到 Gevent 有线程池对象。
有人可以向我解释何时使用线程池以及何时使用常规池吗? gevent.threadpool 和 gevent.pool 有什么区别?
当你有一段需要很长时间运行(几秒钟)并且不会导致 greenlet 切换的 python 代码时,所有其他 greenlet / gevent 作业将“挨饿”并且没有计算时间,它看起来就像你的应用程序 '挂起。
如果您将这个“繁重”任务放入线程池中,线程执行将确保其他 greenlet 不会挨饿。但我相信如果你的代码在C库中花费大量时间,那是没有效果的。
下面是一个例子gevent https://github.com/surfly/gevent/blob/master/examples/threadpool.py。请注意,该示例使用time.sleep
哪个块,而不是gevent.sleep
.
TIP:
如果你有一个需要很长时间运行的循环,那么你可以在循环中放入 gevent.sleep(0) 。每个循环其他小绿叶都有机会运行。这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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)