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

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

在嵌入python时,在调用任何其他Python C API调用之前,由嵌入器负责照顾GIL锁。这是通过以下功能完成的:

gstate = PyGILState_Ensure();
// do some python api calls, run python scripts
PyGILState_Release(gstate);

阅读更多文档后,我还补充道:

PyEval_InitThreads();

那么我在这里哪里出错了呢?

brokenshitbrokenshit提问于
刺激回答于

最终我找到了答案:

PyEval_InitThreads();

你需要调用如下:

PyEval_SaveThread();
图啥来NLPer回答于

我现在是这样做的,你可以参考下:

  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()

扫码关注云+社区

领取腾讯云代金券