いつ電話するべきか少し混乱していますPyEval_InitThreads
。PyEval_InitThreads
一般に、 Python 以外のスレッド (つまり、拡張モジュール内で生成されるスレッド) が使用されるたびに、 を呼び出す必要があることを理解しています。
PyEval_InitThreads
しかし、それが Python インタープリターを組み込んだ C プログラムなのか、C 拡張モジュールをインポートする Python プログラムなのか、あるいはその両方なのか、私は混乱しています。
では、内部でスレッドを起動する C 拡張モジュールを作成したPyEval_InitThreads
場合、モジュールの初期化時に呼び出す必要がありますか?
また、PyEval_InitThreads
暗黙的に Global Interpreter Lock を取得します。したがって、 を呼び出した後PyEval_InitThreads
、おそらく GIL を解放する必要があります。そうしないと、デッドロックが発生します。では、ロックを解除するにはどうすればよいでしょうか。ドキュメントを読んだ後PyEval_ReleaseLock()
、GIL をリリースする方法のようです。ただし、実際には、C 拡張モジュールで次のコードを使用すると:
PyEval_InitThreads();
PyEval_ReleaseLock();
...その後、実行時にPythonは次のように中止します:
Fatal Python error: drop_gil: GIL is not locked
では、GIL を取得した後、どのように GIL を解放しますPyEval_InitThreads
か?