1

我的理解是 tpool 为您提供了一个本地线程池,而 Greenpool 为您提供了绿色线程池(基本上所有绿色线程都在一个本地线程中)。

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

有人可以指出我何时使用一个池与另一个池。

4

1 回答 1

3

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

  • open文件 [1]
  • 具有大量 CPU 工作的 C 扩展,例如lxmlnumpy
  • 使用阻塞套接字的 C 扩展,例如mysqldb

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

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

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

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

于 2013-06-07T08:32:46.473 回答