两个线程可以同时使用相同的嵌入式 python 解释器吗?
Can two threads use the same embedded python interpreter simultaneously?
标题有,但这里有一些详细说明。假设主线程产生另一个线程,其中一些代码被加载到 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);
启动 Python 解释器后还应执行以下操作以确保 threads/GIL 正确初始化:
if (! PyEval_ThreadsInitialized()) {
PyEval_InitThreads();
}
有关这方面的更多信息,请参阅 Non Python Created Threads。
如评论中所述,值得注意的是,这实际上只是序列化对解释器的访问,但假设您使用的是 Python 的 CPython 实现,这是您可以做的最好的事情.
标题有,但这里有一些详细说明。假设主线程产生另一个线程,其中一些代码被加载到 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);
启动 Python 解释器后还应执行以下操作以确保 threads/GIL 正确初始化:
if (! PyEval_ThreadsInitialized()) {
PyEval_InitThreads();
}
有关这方面的更多信息,请参阅 Non Python Created Threads。
如评论中所述,值得注意的是,这实际上只是序列化对解释器的访问,但假设您使用的是 Python 的 CPython 实现,这是您可以做的最好的事情.