标题已经回答了这个问题,但是以下是一些详细解释。假设主线程产生了另一个线程,在这个线程中将一些代码加载到Python解释器中,然后调用另一个线程,该线程通过相同的Python接口(通过PyImport或PyRun)执行一些更多的代码。这种情况可行吗?
标题已经回答了这个问题,但是以下是一些详细解释。假设主线程产生了另一个线程,在这个线程中将一些代码加载到Python解释器中,然后调用另一个线程,该线程通过相同的Python接口(通过PyImport或PyRun)执行一些更多的代码。这种情况可行吗?
如果我理解你的问题正确,那么是的,你可以这样做,但 Python 解释器本身并不完全线程安全。为了解决这个问题,必须确保每个线程在调用任何 Python 代码之前都获得解释器的 GIL ,然后在之后释放它。也就是说,每个线程执行 Python 代码时需要执行以下操作:
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
// Do any needed Python API operations, execute python code
// Release the GIL. No Python API allowed beyond this point.
PyGILState_Release(gstate);
if (! PyEval_ThreadsInitialized()) {
PyEval_InitThreads();
}
更多信息请参见非Python创建的线程。
如评论中所述,值得注意的是这实际上只是对解释器访问进行序列化,但假定您使用的是Python的CPython实现,这是最好的选择。