それで、Python Global Interpreter Lock (GIL) http://blip.tv/file/2232410でこの講演を見終わったところです。
その要点は、GIL がシングル コア システムにとって非常に優れた設計であるということです (Python は基本的に、スレッドの処理/スケジューリングをオペレーティング システムに任せています)。しかし、これはマルチコア システムでは深刻な裏目に出る可能性があり、IO 集中型スレッドが CPU 集中型スレッドによって大幅にブロックされ、コンテキスト切り替えの費用がかかり、ctrl-C の問題 [*] などが発生する可能性があります。
したがって、GIL は基本的に 1 つの CPU で Python プログラムを実行するように制限しているため、これを受け入れて Linux でタスクセットを使用して、プログラムのアフィニティをシステムの特定のコア/CPU に設定しないでください (特に、マルチコア システムで実行されている複数の Python アプリなど)?
最終的に私の質問は次のとおりです。PythonアプリケーションでLinuxでタスクセットを使用しようとした人はいますか(特に、Linuxシステムで複数のアプリケーションを実行して、特定のコアにバインドされた1つまたは2つのPythonアプリケーションで複数のコアを使用できるようにする場合)。結果でしたか?やる価値はありますか?特定のワークロードで事態が悪化することはありますか? 私はこれを実行してテストする予定です (基本的に、プログラムの実行にかかる時間が長いか短いかを確認します) が、あなたの経験について他の人から聞きたいです.
追加: David Beazley (リンクされたビデオで講演を行っている人物) は、一部の C/C++ 拡張機能が GIL ロックを手動で解放し、これらの拡張機能がマルチコア (つまり、科学的または数値データ分析など) 用に最適化されている場合、数を計算するためのマルチコアの利点を得るのではなく、拡張機能は単一のコアに制限されているという点で効果的に機能しなくなります (したがって、プログラムが大幅に遅くなる可能性があります)。一方、このような拡張機能を使用していない場合
マルチプロセッシング モジュールを使用しない理由は、(この場合) プログラムの一部がネットワーク I/O バウンド (HTTP 要求) に大きく依存しているためです。スレッドが HTTP リクエストを開始し、I/O を待機しているため、GIL を放棄し、別のスレッドがそれを実行できるため、プログラムの一部は、CPU に大きな負担をかけずに 100 以上のスレッドを簡単に実行でき、実際に使用できるようになります。利用可能なネットワーク帯域幅。スタックレス Python/etc に関しては、プログラムを書き直したり、Python スタックを置き換えたりすることにあまり関心がありません (可用性も懸念事項です)。
[*] シグナルを受信できるのはメイン スレッドだけなので、ctrl-C を送信すると、Python インタープリターは基本的にシグナルを処理できるようにメイン スレッドを実行させようとしますが、どのスレッドを実行するかを直接制御しないため (これはオペレーティング システムに任されています) 基本的に、最終的にメイン スレッドに到達するまでスレッドを切り替え続けるように OS に指示します (運が悪い場合は、しばらく時間がかかる場合があります)。