私は美しいマルチスレッドスクリプトを作成しましたが、それを実行すると、スレッドハンドラーを直接呼び出すよりも、25スレッドの方がパフォーマンスが低下しました。
それから私はグローバルインタプリタロックを発見しました。このスクリプトのPythonを破棄して別のスクリプトに書き直す前に、Pythonで実際に機能するマルチスレッドを実行する方法はありますか?
私は美しいマルチスレッドスクリプトを作成しましたが、それを実行すると、スレッドハンドラーを直接呼び出すよりも、25スレッドの方がパフォーマンスが低下しました。
それから私はグローバルインタプリタロックを発見しました。このスクリプトのPythonを破棄して別のスクリプトに書き直す前に、Pythonで実際に機能するマルチスレッドを実行する方法はありますか?
もう1つのアプローチは、スレッドを破棄し、代わりにマルチプロセッシングモジュール(Python 2.6以降)を使用することです。マルチプロセッシングモジュールは、GILを回避し、少なくともスレッドモジュールのAPIと同様のAPIを備えています。
これは興味深い質問です。ストレートCPythonでGILをエスケープすることはないと思います。
Stackless Pythonは、マイクロスレッドを使用することでCPythonよりも「並行性」のパフォーマンスが向上するはずですが、GILから逃れることはできないと思います。
さらに、python.orgのGILページによると、JythonとIronPythonにはGILがありません。
正解はあなたがしていることに大きく依存します。
圧縮や画像レンダリングなどのCPUバウンド(およびIOバウンドのブロック)の重いタスクは通常、ネイティブコードを使用して実行され、ネイティブライブラリは通常、動作中にGILを解放します。これにより、同時実行が可能になります。CPUを集中的に使用する作業を狭いネイティブ呼び出しに分離できると、並行性、重要なネイティブパフォーマンス、およびほとんどのコードをPythonで記述できるという利便性が得られます。
すべてのコードに、ネイティブライブラリにきちんと実装できる計算コードの小さくて分離可能なブロックがあるわけではありませんが、多くのコードに含まれています。
私の知る限り、CPython(CでのPythonの実装)では、いいえ。(私が間違っている場合は、私を訂正してください。解決策が存在するかどうかを知りたいです!)
IronPython(.NET)またはJPython(Java / JWM)に興味があるかもしれません。私はそれらを使用していませんが、少なくとも1つは特定の実行環境にネイティブなスレッドをサポートしていると思います。
問題に当てはまる場合は、マルチプロセッシングモジュールを試すことができます。