我有一个用C++编写的库,我使用SWIG封装并在python中使用。通常,一类方法很少。问题在于调用这些方法可能很耗时-它们可能会挂起我的应用程序(调用这些方法时不会释放GIL)。所以我的问题是:

为这些方法调用释放GIL的最简单方法是什么?

(我知道,如果我使用C库,可以用一些其他C代码包装它,但是在这里我使用C++和类)

最佳答案

不知道什么是SWIG,无论如何我都会尝试回答:)

使用类似这样的东西来释放/获取GIL:

class GILReleaser {
    GILReleaser() : save(PyEval_SaveThread()) {}

    ~GILReleaser() {
        PyEval_RestoreThread(save);
    }

    PyThreadState* save;
};

在您选择的代码块中,利用RAII释放/获取GIL:
{
    GILReleaser releaser;
    // ... Do stuff ...
}

07-25 22:31