15.8 C和Python中的线程混用
如果你想将C、Python和线程混合在一起,你需要确保正确的初始化和管理Python的全局解释器锁(GIL)。要想这样做,可以将下列代码放到你的C代码中并确保它在任何线程被创建之前被调用。
- /* Make sure we own the GIL */
- PyGILState_STATE state = PyGILState_Ensure();
- ...
- /* Restore previous GIL state and return */
- PyGILState_Release(state);
每次调用 都要相应的调用 .
要注意的是调用 并不会立刻抢占或中断解释器。如果有其他代码正在执行,这个函数被中断知道那个执行代码释放掉GIL。在内部,解释器会执行周期性的线程切换,因此如果其他线程在执行,调用者最终还是可以运行的(尽管可能要先等一会)。