我在Python C ++应用程序中嵌入Python 3.2,我有几个子解释器在程序中的不同时间运行(由Py_NewInterpreter
创建)。他们在不同时间获取并释放GIL,但是当我想要销毁其中一个副解释器时,我遇到了一个问题。
要销毁子解释器,您必须获取GIL。所以我这样做:
PyEval_AcquireLock(threadstate);
然后我用
销毁解释器Py_EndInterpreter(threadstate);
你会认为它会释放GIL,因为它的东西被破坏了。但是,Py_EndInterpreter
的文档说:
给定的线程状态必须是 当前线程状态。见 下面讨论线程状态。 当呼叫返回时,当前 线程状态为NULL。 (全局解释器锁必须在调用此函数之前保持,并在返回时仍保持。)
因此,如果我在销毁子解释器时必须保持GIL并且销毁子解释器将其设置为NULL并且我必须拥有获取GIL的线程来释放它,如何在销毁之后释放GIL子解释?
答案 0 :(得分:2)
如果在致电PyEval_ReleaseLock()
后直接致电Py_EndInterpreter()
会怎样?无论如何,这就是文档告诉你的事情。 :)