python eventlet-何时使用tpool VS Greenpool

python eventlet-何时使用tpool VS Greenpool,python,threadpool,eventlet,Python,Threadpool,Eventlet,我的理解是,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(),

我的理解是,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
    
  • 绿池

    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
    .......
    

有人能告诉我什么时候使用一个游泳池和另一个游泳池吗。

在完美世界[3],你只需要
GreenPool
。但当您调用某些不可避免的阻塞代码时:

  • 打开
    文件[1]
  • 具有大量CPU工作的C扩展,如
    lxml
    numpy
  • 使用阻塞套接字的C扩展,如
    mysqldb
它阻塞的时间正成为一个问题[2],然后您可以尝试tpool将这些阻塞任务卸载到单独的线程。CPython为此付出了巨大的代价,所以它并不总是有帮助的,再次衡量一切。例如,
open('/dev/null',rb')
在大多数情况下会更便宜;打开('/mnt/nfs/file',rb')时连接远程服务器可能需要一段时间

[1] 处理文件既有异步选项,也有非阻塞选项。不幸的是,对于Linux,除了
tpool
之外,我不知道还有什么解决方案可以真正替代
open

[2] 这只有通过检测、测量和观察指标才能知道。在这个领域里,有很多糟糕的软件和很棒的软件,你至少应该用一些东西来知道确切的数字。“感觉很慢”不是一个信息。“上次发布后平均响应时间下降了20%”更有用

[3] 完美世界的例子:Erlang、Go、Haskell