私はPyEval_InitThreads
と呼ぶはずです。一般に、私はPyEval_InitThreads
は、非Pythonスレッド(つまり、拡張モジュール内で生成されたスレッド)が使用されるたびに呼び出さなければならないことを理解しています。PyEval_InitThreadsはいつ呼び出されるのですか?
しかし、PyEval_InitThreads
がPythonインタプリタを埋め込んだCプログラム、またはC拡張モジュールを読み込むPythonプログラム、あるいはその両方の場合は、私は混乱します。
内部でスレッドを起動するC拡張モジュールを作成する場合、モジュールを初期化するときにPyEval_InitThreads
を呼び出す必要がありますか?
また、PyEval_InitThreads
implicitly acquires the Global Interpreter Lockもあります。したがって、PyEval_InitThreads
を呼び出した後、おそらくGILはにリリースされなければならないか、デッドロックが発生します。では、どうやってロックを解除しますか?ドキュメントを読んだ後、PyEval_ReleaseLock()
はGILをリリースする方法のようです。しかし、実際には、私はC拡張モジュールに次のコードを使用している場合:
PyEval_InitThreads();
PyEval_ReleaseLock();
を...そして、実行時にPythonがで中止されます:それでは、どのように取得した後にGILを解放しない
Fatal Python error: drop_gil: GIL is not locked
それはPyEval_InitThreads
と?
'PyEval_ReleaseLock()'を使わずに試してみてください。 GILは正当な理由のために取得されます。 Pythonから他のC API関数を呼び出す前にそれを解放すると、クラッシュすることになります。 –