【问题标题】:Can two threads use the same embedded python interpreter simultaneously?两个线程可以同时使用同一个嵌入式 python 解释器吗?
【发布时间】:2016-11-30 03:38:00
【问题描述】:

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

【问题讨论】:

  • 您希望两个线程共享同一个嵌入式解释器吗?
  • @epicbrew 是的,同一个解释器,两个线程都可以访问同一个内存

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


【解决方案1】:

如果我按照您的要求进行操作,那么您可以这样做,但是 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

如 cmets 中所述,值得注意的是,这实际上只是序列化对解释器的访问,但假设您使用的是 Python 的 CPython 实现,这是您能做的最好的事情。

【讨论】:

  • 你确定吗,Epic?在我看来,您确实(充其量...)序列化线程对单个解释器实例的使用。在我看来,OP 希望每个(C++)线程都有自己的 Python 解释器实例,并且能够并行运行,线程由 C++ 完成,而不是 Python。或者,我是否误读了 OP 的意图?
  • @MikeRobinson 我以为他想要两个线程共享同一个解释器。
  • 是的,而且,即使 Python 的“线程”是“只是'某种'线程”(因为,当然,Python 是一个解释器......),我有点认为我会将我的线程放入 Python 代码中。我们知道 Python 正确地管理 its 版本的线程 ...
  • 其实Python的线程是真正的原生线程。但他们必须在执行 Python 字节码之前获取 GIL。
  • 是的......而且 OP 重新装备他的应用程序可能是不可行的。
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
相关资源
最近更新 更多