私は一般的に、PythonのGlobal Interpreter Lock(GIL)がどのように動作するかをよく理解しています。本質的に、インタープリタが実行されている間、一方のスレッドはGILをNティック(N
はsys.setcheckinterval
を使用して設定できます)を保持します。この時点でGILは解放され、別のスレッドはGILを取得できます。 1つのスレッドがI/O操作を開始した場合も同様です。Python:GIL context-switching
私が少し混乱しているのは、これがC拡張モジュールでどのように動作するかです。
GILを取得し、PyEval_EvalCode
を使用していくつかのPythonコードを実行するC拡張モジュールをお持ちの場合、インタープリタは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);
[関連する質問](http://stackoverflow.com/questions/29317120/forcing-a-thread-to-block-all-other-threads-from-executing)を参照してください。私はあなたのステートメントとPython Cookbookのステートメントとの間の見た目の不一致を解決する方法を理解していません。 – max
[アルバートの答え](http://stackoverflow.com/a/29328066)を参照してください。 –