[解決済み] マルチプロセッシングモジュールのThreadPoolとPoolの違いは何ですか?
質問
とはどのような違いがあるのでしょうか?
ThreadPool
と
Pool
で
multiprocessing
モジュールに追加しました。 私のコードを試してみると、これが主な相違点です。
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
プールの実装を見ると良いでしょう。
関連
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み] リストとタプルの違いは何ですか?
-
[解決済み] 2つのリストの差を取得する
-
[解決済み] PythonモジュールとPythonパッケージの違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenvなどの違いは何ですか?
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] マルチプロセシングプールに似たスレッディングプール?
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] if 節の終了方法
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法