两个线程可以同时使用相同的嵌入式python解释器吗?

时间:2016-07-26 13:04:42

标签: python c++ multithreading interpreter python-c-api

标题有它,但这里有一些详细说明。假设主线程产生另一个线程,其中一些代码被加载到python解释器中,然后调用另一个线程,该线程通过相同的python接口(通过PyImport或PyRun)执行更多代码。这种情况是否可行?

1 个答案:

答案 0 :(得分:2)

如果我跟随你的要求,那么你可以这样做,但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解释器之后,您应该执行以下操作以确保正确初始化线程/ GIL:

if (! PyEval_ThreadsInitialized()) {
    PyEval_InitThreads();
}

有关详细信息,请参阅Non Python Created Threads

正如评论中所提到的,值得注意的是,这实际上只是序列化对解释器的访问,但假设您正在使用Python的CPython实现,它是您可以做的最好的。