Pythonのスレッドはよりシンプルで安全になり、I / Oベースのアプリケーション用であるため、GILをバイパスできます。とはいえ、ツイストまたは非ブロックソケット/選択を使用した非ブロックI / Oを検討しましたか?
編集:スレッドの詳細
Pythonスレッド
Pythonのスレッドはシステムスレッドです。ただし、Pythonはグローバルインタープリターロック(GIL)を使用して、インタープリターが一度に特定のサイズのバイトコード命令のブロックのみを実行するようにします。幸運なことに、Pythonは入出力操作中にGILを解放するため、非ブロッキングI / Oのシミュレーションにスレッドが役立ちます。
重要な注意:バイトコード命令の数はプログラムの行数に対応していないため、これは誤解を招く可能性があります。ミューテックスのロックが必要であるので、1つでも割り当ては、Pythonでアトミックではないかもしれない任意さえGILと、アトミックに実行されなければならないコードのブロック。
QTスレッド
Pythonがサードパーティのコンパイル済みモジュールに制御を渡すと、GILが解放されます。必要な場合に原子性を確保するのはモジュールの責任になります。制御が戻されると、PythonはGILを使用します。これにより、サードパーティのライブラリをスレッドと組み合わせて使用すると混乱が生じる可能性があります。外部スレッドライブラリを使用することはさらに困難です。これは、インタープリターではなくモジュールの制御がどこでいつ制御されるかについての不確実性を追加するためです。
QTスレッドは、リリースされたGILで動作します。QTスレッドは、QTライブラリコード(およびGILを取得しない他のコンパイル済みモジュールコード)を同時に実行できます。ただし、QTスレッドのコンテキスト内で実行されるPythonコードは引き続き GILを取得するため、コードをロックするための2つのロジックセットを管理する必要があります。
結局、QTスレッドとPythonスレッドはどちらもシステムスレッドのラッパーです。Pythonスレッドは、Pythonで書かれていない(GILを暗黙的に使用している)部分は、どのような場合でもGILを使用するため、使用するのはわずかに安全です(ただし、上記の警告が引き続き適用されます)。
ノンブロッキングI / O
スレッドは、アプリケーションを非常に複雑にします。特に、Pythonインタープリターとコンパイルされたモジュールコード間のすでに複雑な相互作用を処理する場合。多くの場合、イベントベースのプログラミングを理解するのは難しいと思いますが、多くの場合、イベントベースのノンブロッキングI / Oは、スレッドよりも推論するのがはるかに簡単です。
非同期I / Oを使用すると、開いている記述子ごとに、実行のパスが一貫して規則正しくなっていることを常に確認できます。明らかに、あるオープンチャネルに依存するコードがさらに別のオープンチャネルがデータを返すときに呼び出されるコードの結果に依存する場合の対処法など、対処する必要がある問題があります。
イベントベースのノンブロッキングI / Oの優れたソリューションの1つは、新しいDieselライブラリです。現時点ではLinuxに制限されていますが、非常に高速で非常にエレガントです。
すばらしいlibeventライブラリのラッパーであるpyeventを学ぶことも価値があります。これは、システムで利用可能な最速の方法(コンパイル時に決定される)を使用してイベントベースのプログラミングの基本的なフレームワークを提供します。