【要約】Python の ThreadPoolExecutor と ProcessPoolExecutor の基本の紹介 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
Python開発者が、大量のタスクを効率的に処理しようとする際、処理時間の増大という課題に直面する。
- ・逐次実行による、I/O待ち時間の無駄な発生。
- ・GILの影響による、マルチコアを活用できない計算処理の遅延。
- ・タスクの性質に合わないExecutor選択による、パフォーマンスの低下。
// Approach
標準ライブラリを用い、タスクの性質に応じた2つのExecutorを使い分ける手法を提示している。
- ・
ThreadPoolExecutor: スレッドを利用し、I/O待ち時間を有効活用する。 - ・
ProcessPoolExecutor: 独立したプロセスを起動し、GILを回避して並列計算を行う。 - ・APIの使い分け: 一括適用には
map()、個別管理にはsubmit()を用いる。
// Result
適切なExecutorを選択することで、実行時間の劇的な改善が見込める。
- ・I/O待ち処理(1秒×8件)を4スレッドで実行し、約8秒から2秒へ短縮。
- ・
ProcessPoolExecutorにより、計算処理を複数のCPUコアへ分散。 - ・
Futureにより、非同期処理の結果や例外を制御可能。
Senior Engineer Insight
> 実戦投入には、シリアライズの制約やメモリ消費への警戒が不可欠だ。特に
ProcessPoolExecutorは、プロセス起動コストやメモリ使用量が増大する。また、pickleによるデータ転送のオーバーヘッドも無視できない。単なる並列化ではなく、タスクの性質を正確に見極める審美眼が求められる。