我有点搞不清什么时候该给PyEval_InitThreads
打电话。一般来说,我理解每当使用非Python线程(即在扩展模块中生成的线程)时必须调用PyEval_InitThreads
。在
但是,我很困惑PyEval_InitThreads
是用于嵌入Python解释器的C程序,还是用于导入C扩展模块的Python程序,或者两者都是。在
因此,如果我编写一个将在内部启动线程的C扩展模块,那么在初始化该模块时是否需要调用PyEval_InitThreads
?在
另外,PyEval_InitThreads
implicitly acquires the Global Interpreter Lock。所以在调用PyEval_InitThreads
之后,大概GIL必须释放,否则就会出现死锁。那你怎么打开锁呢?在阅读了文档之后,^{
PyEval_InitThreads();
PyEval_ReleaseLock();
…然后在运行时Python会中止:
^{pr2}$那么,在用PyEval_InitThreads
获得GIL后,如何释放它呢?在
大多数应用程序根本不需要知道
PyEval_InitThreads()
。在唯一应该使用它的时候是,如果您的嵌入应用程序或扩展模块将从Python外部生成的多个线程进行pythoncapi调用。在
不要在以后将进行pythoncapi调用的任何线程中调用
PyEval_ReleaseLock()
(除非在调用之前重新获取它)。在这种情况下,您应该使用Py_BEGIN_ALLOW_THREADS
和Py_END_ALLOW_THREADS
宏。在相关问题 更多 >
编程相关推荐