1. ホーム
  2. python

[解決済み] マルチプロセッシングモジュールのThreadPoolとPoolの違いは何ですか?

2023-05-08 11:47:39

質問

とはどのような違いがあるのでしょうか? ThreadPoolPoolmultiprocessing モジュールに追加しました。 私のコードを試してみると、これが主な相違点です。

from multiprocessing import Pool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = Pool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

以下のように出力されますね。

hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
inside hello()
Proccess id:  13268
inside hello()
Proccess id:  11104
inside hello()
Proccess id:  13064
[0, 1, 4]

"ThreadPool"を使って。

from multiprocessing.pool import ThreadPool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = ThreadPool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

以下のように出力されますね。

hi outside of main()
inside hello()
inside hello()
Proccess id:  15204
Proccess id:  15204
inside hello()
Proccess id:  15204
[0, 1, 4]

私の質問です。

  • の中で毎回「外側の __main__() 」が実行されるのはなぜですか? Pool ?

  • multiprocessing.pool.ThreadPool は新しいプロセスを生成しないのですか? それは単に新しいスレッドを作成するだけですか?

  • もしそうなら multiprocessing.pool.ThreadPool を使うのと、単に threading モジュールですか?

の公式ドキュメントは見当たりません。 ThreadPool の公式なドキュメントが見当たりません。どこにあるのか、誰か教えてください。

どのように解決するには?

この multiprocessing.pool.ThreadPool と同じ振る舞いをします。 multiprocessing.Pool と同じ動作をしますが、唯一異なるのは、プロセスの代わりにスレッドを使用してワーカーロジックを実行する点です。

あなたが見た理由は

hi outside of main()

で複数回印刷される。 multiprocessing.Pool が複数回出力されるのは、プールが スポーン 5 つの独立したプロセスを生成します。各プロセスはそれ自身の Python インタープリタを初期化し、モジュールをロードして、トップレベルの print が再び実行されます。

この現象は spawn プロセス作成メソッドを使用した場合のみです (Windows で使用できる唯一のメソッド)。もし fork を使用した場合(Unix)、スレッドと同様に一度だけメッセージが表示されます。

multiprocessing.pool.ThreadPool は実装が完成していないため、ドキュメント化されていません。テストやドキュメントが不足しているのです。その実装を見ることができるのは ソースコード .

次の自然な疑問は、いつスレッドベースのプールを使用し、いつプロセスベースのものを使用するかということだと思います。

経験則から言うと

  • IOバウンドジョブ -> multiprocessing.pool.ThreadPool
  • CPUバウンドジョブ -> multiprocessing.Pool
  • ハイブリッドジョブ -> ワークロードに依存しますが、私は通常は multiprocessing.Pool プロセス分離の利点があるためです。

Python 3 の場合、このようなプロセス分離のために concurrent.future.Executor プールの実装を見ると良いでしょう。