1

私の理解では、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
    .......
    

あるプールと別のプールをいつ使用するか教えてください。

4

1 に答える 1

3

完璧な世界 [3] では、必要なのはGreenPool. ただし、必然的にブロックするコードを呼び出すと、次のようになります。

  • openファイル [1]
  • lxmlまたはのような多くのCPU作業を伴うC拡張numpy
  • 次のようなブロッキング ソケットを使用する C 拡張mysqldb

そして、それがブロックする時間が問題になりつつあります [2] 場合は、tpool を試して、これらのブロックしているタスクを別のスレッドにオフロードすることができます。CPython には大きなコストがかかるため、常に役立つとは限りません。[2] すべてを測定します。たとえばopen('/dev/null', 'rb')、ほとんどの場合は安くなります。リモートサーバーへの接続に時間open('/mnt/nfs/file', 'rb')がかかる場合があります。

[1] ファイルを処理するための非同期オプションと非ブロック オプションの両方があります。tpool残念ながら、Linux の場合、ドロップインの代替として実際に機能するようなソリューションを私は知りませんopen

[2] これは、メトリックを計測し、測定し、監視することでしかわかりません。その分野にはひどいソフトウェアと優れたソフトウェアの両方がたくさんあり、正確な数を知るために少なくとも何かを使用する必要があります. 「遅く感じる」は情報ではありません。「前回のリリース後、平均応答時間が 20% 短縮されました」の方がはるかに便利です。

[3] 完璧な世界の例: Erlang、Go、Haskell

于 2013-06-07T08:32:46.473 に答える