7

マルチコアマシンで一度にPythonバイトコードを実行できるPythonスレッドは1つだけであるという、PythonのGIL問題について聞いたことがあります。したがって、マルチスレッドのPythonプログラムはお勧めできません。

pthreadプログラムのパフォーマンスを向上させる可能性のあるC拡張機能を作成できるかどうか疑問に思っています。C拡張機能にスレッドを作成し、Pythonのメインスレッドと並行して実行したいと思います。

私の仮定では、PythonメインスレッドはIOに関連することを実行しますがpthread、私のC拡張機能ではほとんどの時間を計算に費やします。Pythonメインスレッドは、キューを使用してC拡張機能のスレッドと通信します(プロデューサーコンシューマーモデルのように)。

PythonとC拡張機能を備えたマルチスレッドに違いはありますか?

4

3 に答える 3

2

元の質問に答えるには:

はい。C拡張機能は、GILが保持されていない状態でPython API関数を呼び出さない限り、GILの影響を受けませんしたがって、Pythonアプリと通信する必要がある場合は、GILを取得する必要があります。C APIで手を汚したくない場合はctypes、Cライブラリ(通常どおりに使用できます)を呼び出すpthreadsか、Cythonを使用してPythonのような構文でC拡張機能を記述できます。

于 2012-09-28T08:22:06.440 に答える
1

Pythonインタープリターは、Cで起動されたスレッドをまったく認識しないため、自分のCPU時間をうまくチャーンできます。

ただし、これがパフォーマンスの問題に対する正しい解決策であるとは思えません。まず、マルチプロセスモジュールで複数のプロセスを使用してみてください。その後、プロセス間IOが多すぎると、Cスレッドのようなトリックが発生する可能性があります。これにより、プログラムが1桁複雑になるため、可能であれば避けてください。

于 2012-09-28T08:19:31.093 に答える
0

一方のスレッドがCPUバウンドを実行し、もう一方のスレッドがIOバウンドを実行している場合、問題は発生しません。

IOバウンドスレッドはIOルーチンを呼び出します。IOルーチンは通常、処理中にGILを解放し、他のスレッドを効果的に実行できるようにします。

したがって、「単純な」ソリューションを試してみて、実際に希望どおりに機能しない場合にのみ切り替えてください。

于 2012-09-28T08:34:24.353 に答える