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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (147)

我将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();

你需要调用

PyEval_SaveThread();

正确释放主线程的GIL。

用户回答回答于

我有完全相同的问题,现在通过PyEval_SaveThread()立即使用解决PyEval_InitThreads(),正如你在上面建议的那样。然而,我的实际问题是,我使用PyEval_InitThreads()PyInitialise(),然后导致PyGILState_Ensure()阻止从不同的,后续的本地线程调用。总之,这就是我现在所做的:

  1. 有全局变量: static int gil_init = 0;
  2. 从主线程加载本地C扩展并启动Python解释器: Py_Initialize()
  3. 从多个其他线程中,我的应用程序同时对Python / C API进行了大量调用: if (!gil_init) { gil_init = 1; PyEval_InitThreads(); PyEval_SaveThread(); } state = PyGILState_Ensure(); // Call Python/C API functions... PyGILState_Release(state);
  4. 从主线程停止Python解释器 Py_Finalize()

我试过的所有其他解决方案要么导致随机Python sigfaults或死锁/阻塞使用PyGILState_Ensure()

Python文档在这方面应该更加清楚,并且至少为嵌入和扩展用例提供了一个例子。

扫码关注云+社区

领取腾讯云代金券