小编典典

在多线程C应用程序中嵌入python

python

我将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()但这就是令人困惑的部分。文档指出此功能:

初始化并获取全局解释器锁

这表明当该函数返回时,应该锁定GIL,并且应该以某种方式将其解锁。但实际上,这似乎不是必需的。有了这条线,我的多线程就可以完美地工作,并且相互保留PyGILState_Ensure/Release功能。
当我尝试添加PyEval_ReleaseLock()后,PyEval_ReleaseLock()该应用在随后的调用中很快陷入僵局PyImport_ExecCodeModule()

那我在这里想念什么?


阅读 387

收藏
2020-12-20

共1个答案

小编典典

最终我明白了。

PyEval_InitThreads();

你需要打电话

PyEval_SaveThread();

正确释放主线程的GIL。

2020-12-20