与讨论here的问题类似,我需要从多线程C ++程序中调用异步python代码。但它不会是调用python执行的主线程(调用Py_Initialize()
和PyEval_InitThreads()
的主线程)。
我不知道如何管理对PyEval_SaveThread()
和PyEval_RestoreThread()
的调用:调用PyEval_SaveThread()
并将检索到的线程状态保持未使用是否安全?拨打PyThreadState_Clear()
会有意义吗?
我想尽可能使用PyGILState_Ensure()
和PyGILState_Release()
来管理GIL。
谢谢!
编辑1:
我在主线程中试过了:
PyEval_InitThreads();
Py_Initialize();
PyThreadState* _state = PyEval_SaveThread();
PyEval_AcquireLock();
PyThreadState_Clear(_state);
PyEval_ReleaseLock();
我遇到了分段错误。
编辑2:
我没有办法在PyThreadState
之后放弃PyEval_SaveThread()
,但我确认只能处理
保存线程后,PyGILState_Ensure()
和PyGILState_Release()
保护python执行,无论我们是否仍在同一个线程中。
最后,似乎必须在完成之前恢复线程。
编辑3:
答案 0 :(得分:0)
我也在学习,所以这里的信息可能不完整,但至少我可以克服分段错误。
使用Python 2.7 C API。
在main()中:
No errors!
在你的主题的run方法中:
Py_Initialize();
PyEval_InitThreads();
// IMPORTNT: You must release before launching threads
PyEval_ReleaseLock();
// Create/Start threads here
// Wait until threads ends
// Before finishing, acquire the GIL
PyGILState_STATE gstate = PyGILState_Ensure();
Py_Finalize();
注意:强> 当我从我的线程调用的Python代码涉及导入模块和创建pyplot对象时,我遇到了一些麻烦,但这是另一个故事。