そのため、Python のグローバル インタープリター ロック(GIL)がどのように機能するかについて、私は一般的にかなりよく理解しています。基本的に、インタープリターの実行中、1 つのスレッドが N ティック (N
を使用して設定できますsys.setcheckinterval
) の間 GIL を保持し、その時点で GIL が解放され、別のスレッドが GIL を取得できます。これは、1 つのスレッドが I/O 操作を開始した場合にも発生します。
私が少し混乱しているのは、これがすべて C 拡張モジュールでどのように機能するかということです。
GIL を取得してから を使用して Python コードを実行する C 拡張モジュールがある場合PyEval_EvalCode
、インタープリターは GIL を解放して他のスレッドに渡すことができますか? それとも、GIL を取得した C スレッドは、PyEval_EvalCode
戻って GIL が C で明示的に解放されるまで、GIL を永続的に保持しますか?
PyGILState gstate = PyGILState_Ensure();
....
/* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */
PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict);
PyGILState_Release(gstate);