python eventlet - 何时使用tpool VS Greenpool

时间:2013-06-06 23:07:14

标签: 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(), 
                                            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
    .......
    

有人可以指出我何时使用一个游泳池而不是另一个游泳池。

1 个答案:

答案 0 :(得分:3)

在完美世界[3]中,你只需要GreenPool。但是当你打电话给一些不可避免的阻塞代码时:

  • open档案[1]
  • 包含大量CPU工作的C扩展程序,如lxmlnumpy
  • 使用mysqldb
  • 等阻塞套接字的C扩展

并且它所阻止的时间正在成为一个问题[2]然后你可以尝试tpool将这些阻塞任务卸载到单独的线程。 CPython的成本很高,所以它并不总是有帮助,再次衡量一切。例如。 open('/dev/null', 'rb')在大多数情况下会更便宜;虽然open('/mnt/nfs/file', 'rb')可能需要一段时间来连接远程服务器。

[1]有处理文件的异步和非阻塞选项。不幸的是,对于Linux,除了tpool之外我不知道任何解决方案,因为它真的可以作为open的替代品。

[2]你只会知道仪表,测量和观察指标。在该领域有大量的可怕和优秀的软件,你应该至少使用一些东西来了解确切的数字。 “感觉很慢”不是一种信息。 “平均响应时间在上次发布后下降了20%”更有用。

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