何时调用PyEval_InitThreads?

2024-09-30 14:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点搞不清什么时候该给PyEval_InitThreads打电话。一般来说,我理解每当使用非Python线程(即在扩展模块中生成的线程)时必须调用PyEval_InitThreads。在

但是,我很困惑PyEval_InitThreads是用于嵌入Python解释器的C程序,还是用于导入C扩展模块的Python程序,或者两者都是。在

因此,如果我编写一个将在内部启动线程的C扩展模块,那么在初始化该模块时是否需要调用PyEval_InitThreads?在

另外,PyEval_InitThreadsimplicitly acquires the Global Interpreter Lock。所以在调用PyEval_InitThreads之后,大概GIL必须释放,否则就会出现死锁。那你怎么打开锁呢?在阅读了文档之后,^{}似乎是发布GIL的方法。但是,实际上,如果我在C扩展模块中使用以下代码:

   PyEval_InitThreads();
   PyEval_ReleaseLock();

…然后在运行时Python会中止:

^{pr2}$

那么,在用PyEval_InitThreads获得GIL后,如何释放它呢?在


Tags: 模块the方法文档程序lock线程global
1条回答
网友
1楼 · 发布于 2024-09-30 14:30:41

大多数应用程序根本不需要知道PyEval_InitThreads()。在

唯一应该使用它的时候是,如果您的嵌入应用程序或扩展模块将从Python外部生成的多个线程进行pythoncapi调用。在

不要在以后将进行pythoncapi调用的任何线程中调用PyEval_ReleaseLock()(除非在调用之前重新获取它)。在这种情况下,您应该使用Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS宏。在

相关问题 更多 >