5

いつ電話するべきか少し混乱していますPyEval_InitThreadsPyEval_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か?

4

1 に答える 1

3

ほとんどのアプリケーションは、まったく知る必要はありませんPyEval_InitThreads()

これを使用する必要があるのは、埋め込みアプリケーションまたは拡張モジュールが、Pythonの外部で生成された複数のスレッドからPythonCAPI呼び出しを行う場合のみです。

PyEval_ReleaseLock()後でPythonCAPI呼び出しを行うスレッドを呼び出さないでください(それらの前に再取得しない限り)。その場合は、代わりにPy_BEGIN_ALLOW_THREADSandPy_END_ALLOW_THREADSマクロを実際に使用する必要があります。

于 2013-02-17T19:17:43.717 に答える