私は、マルチプロセッシング以上スレッドマルチプロセスはグローバルインタープリタロックを回避できることは知っていますが、他にはどのような利点があるのでしょうか。また、スレッドでは同じことはできないのでしょうか。
ベストアンサー1
私が思いついたいくつかの長所と短所を以下に示します。
マルチプロセッシング
長所
- 独立したメモリ空間
- コードは通常は単純です
- 複数のCPUとコアを活用
- cPythonのGIL制限を回避
- 共有メモリを使用しない限り、同期プリミティブの必要性がほとんどなくなります(代わりに、IPC の通信モデルになります)。
- 子プロセスは中断/終了可能
- Python
multiprocessing
モジュールには、次のようなインターフェースを備えた便利な抽象化が含まれています。threading.Thread
- CPUバウンド処理に必須のcPython
短所
- IPC は少し複雑で、オーバーヘッドも大きくなります (通信モデル vs. 共有メモリ/オブジェクト)
- メモリフットプリントの拡大
スレッド
長所
- 軽量 - メモリ使用量が少ない
- 共有メモリ - 別のコンテキストからの状態へのアクセスが容易になります
- レスポンシブなUIを簡単に作成できます
- GILを適切に解放するcPython C拡張モジュールは並列に実行されます
- I/Oバウンドアプリケーションに最適なオプション
短所
- cPython - GILに従う
- 中断/強制終了不可
- コマンド キュー/メッセージ ポンプ モデル (
Queue
モジュールを使用) に従わない場合は、同期プリミティブを手動で使用する必要があります (ロックの粒度を決定する必要があります) - コードを理解するのが難しく、正しく記述するのが難しくなるため、競合状態が発生する可能性が劇的に増大します。