我的理解是tpool为您提供了一个原生线程池,而Greenpool为您提供了绿色线程池(基本上所有绿色线程都在一个本机线程中)。
TPOOL
def my_func(start_ident):
print "start_ident:%s" % start_ident
print "running in new thread: %s %s" % (start_ident != thread.get_ident(),
thread.get_ident())
tpool.execute(my_func, thread.get_ident()
结果:不同的原生线程
start_ident:140735259603328
running in new thread: True 4616945664
Greenpool
def worker(line):
print "worker in thread %s" % thread.get_ident()
return line
pool = GreenPool()
for result in pool.imap(worker, open("test.txt", 'r')):
print result
结果:绿色线程在同一本机线程中运行
worker in thread 140735259603328
worker in thread 140735259603328
worker in thread 140735259603328
worker in thread 140735259603328
.......
有人可以指出我何时使用一个游泳池而不是另一个游泳池。
答案 0 :(得分:3)
在完美世界[3]中,你只需要GreenPool
。但是当你打电话给一些不可避免的阻塞代码时:
open
档案[1] lxml
或numpy
mysqldb
并且它所阻止的时间正在成为一个问题[2]然后你可以尝试tpool将这些阻塞任务卸载到单独的线程。 CPython的成本很高,所以它并不总是有帮助,再次衡量一切。例如。 open('/dev/null', 'rb')
在大多数情况下会更便宜;虽然open('/mnt/nfs/file', 'rb')
可能需要一段时间来连接远程服务器。
[1]有处理文件的异步和非阻塞选项。不幸的是,对于Linux,除了tpool
之外我不知道任何解决方案,因为它真的可以作为open
的替代品。
[2]你只会知道仪表,测量和观察指标。在该领域有大量的可怕和优秀的软件,你应该至少使用一些东西来了解确切的数字。 “感觉很慢”不是一种信息。 “平均响应时间在上次发布后下降了20%”更有用。
[3]完美世界的例子:Erlang,Go,Haskell