我将python解释器嵌入到多线程C应用程序中,对于应该使用哪些API来确保线程安全,我有些困惑。
从我收集到的信息来看,嵌入python时,在调用任何其他Python C API调用之前,由嵌入器负责GIL锁定。这是通过以下功能完成的:
gstate = PyGILState_Ensure(); // do some python api calls, run python scripts PyGILState_Release(gstate);
但是,仅此一项似乎还不够。我仍然遇到随机崩溃,因为它似乎并未为Python API提供互斥。
阅读更多文档后,我还添加了:
PyEval_InitThreads();
在致电之后,Py_IsInitialized()但这就是令人困惑的部分。文档指出此功能:
Py_IsInitialized()
初始化并获取全局解释器锁
这表明当该函数返回时,应该锁定GIL,并且应该以某种方式将其解锁。但实际上,这似乎不是必需的。有了这条线,我的多线程就可以完美地工作,并且相互保留PyGILState_Ensure/Release功能。 当我尝试添加PyEval_ReleaseLock()后,PyEval_ReleaseLock()该应用在随后的调用中很快陷入僵局PyImport_ExecCodeModule()。
PyGILState_Ensure/Release
PyEval_ReleaseLock()
PyImport_ExecCodeModule()
那我在这里想念什么?
最终我明白了。 后
你需要打电话
PyEval_SaveThread();
正确释放主线程的GIL。