【发布时间】:2013-08-23 20:19:28
【问题描述】:
我注意到 Gevent 有线程池对象。 有人可以向我解释何时使用线程池以及何时使用常规池吗? gevent.threadpool 和 gevent.pool 有什么区别?
【问题讨论】:
标签: python threadpool gevent
我注意到 Gevent 有线程池对象。 有人可以向我解释何时使用线程池以及何时使用常规池吗? gevent.threadpool 和 gevent.pool 有什么区别?
【问题讨论】:
标签: python threadpool gevent
当您有一段 python 代码需要很长时间(几秒钟)运行并且不会导致 greenlets 切换时,所有其他 greenlets / gevent 作业将“饿死”并且没有计算时间,它看起来像您的应用程序“挂起”。
如果你把这个“繁重”的任务放在线程池中,线程执行将确保其他 greenlet 不会饿死。但我相信如果你的代码在 C 库中花费大量时间,它不会有任何效果。
以下是来自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
【讨论】:
ctypes?因为如果您释放 GIL(手动在 C 扩展中或像 ctypes 那样自动释放),那么应用程序将从 ThreadPool 中受益,不是吗?