【问题标题】:Releasing the GIL after destroying a sub-interpreter销毁子解释器后释放 GIL
【发布时间】:2011-07-19 07:39:09
【问题描述】:

我将 Python 3.2 嵌入到 C++ 应用程序中,并且我有几个子解释器在程序中的不同时间运行(由 Py_NewInterpreter 创建)。他们在不同时间获取和释放 GIL,但是当我想销毁其中一个子解释器时遇到了问题。

要销毁子解释器,您必须获得 GIL。所以我这样做:

PyEval_AcquireLock(threadstate);

然后我用

销毁解释器
Py_EndInterpreter(threadstate);

而且你会认为它会释放 GIL,因为持有它的东西被摧毁了。但是,Py_EndInterpreter 的文档说:

给定的线程状态必须是 当前线程状态。见 下面讨论线程状态。 当调用返回时,当前 线程状态为 NULL。 (全局解释器锁必须在调用此函数之前保持,并且在它返回时仍然保持。)

因此,如果我在销毁子解释器时必须持有 GIL,并且销毁子解释器将其设置为 NULL,并且我必须让获得 GIL 的线程释放它,那么在销毁一个子解释器后如何释放 GIL副翻译?

【问题讨论】:

    标签: python python-3.x interpreter gil


    【解决方案1】:

    如果在调用Py_EndInterpreter() 之后直接调用PyEval_ReleaseLock() 会发生什么?无论如何,这就是文档告诉您要做的事情。 :)

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多