两个线程能同时使用同一个嵌入式Python解释器吗?

5

标题已经回答了这个问题,但是以下是一些详细解释。假设主线程产生了另一个线程,在这个线程中将一些代码加载到Python解释器中,然后调用另一个线程,该线程通过相同的Python接口(通过PyImport或PyRun)执行一些更多的代码。这种情况可行吗?


1
你想要两个线程共享同一个嵌入式解释器,对吗? - mshildt
@epicbrew 是的,同一个解释器,两个线程都可以访问相同的内存。 - user3496846
1个回答

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

更多信息请参见非Python创建的线程

如评论中所述,值得注意的是这实际上只是对解释器访问进行序列化,但假定您使用的是Python的CPython实现,这是最好的选择。


@MikeRobinson 我原以为他想要两个线程共享同一个解释器。 - mshildt
是的,尽管Python的“线程”只是“类似于线程”的(因为Python当然是一个解释器...),但我有点认为我会将我的线程放入Python代码中。我们知道Python可以正确地管理它自己的线程版本... - Mike Robinson
实际上,Python的线程是真正的本地线程。但是在执行Python字节码之前,它们必须获取GIL。 - mshildt
@MikeRobinson,你理解得没错,我想要同时运行这两个线程。 - user3496846
@epicbrew 噢,好的,那是个不错的答案,尽管并不是很有希望。但既然它是最接近我所问的,我会把它标记为答案。谢谢! - user3496846
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接