在C++代码中释放Python GIL

uhz*_*uhz 7 c++ python swig gil

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

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

(据我所知,如果我使用了一个C库,我可以使用一些额外的C代码来包装它,但在这里我使用C++和类)

uhz*_*uhz 8

真正的问题是SWIG没有很好地记录(我看到了使用changelog进行搜索的提示;)).

好的,我发现我可以在SWIG中使用内联函数并使用宏来发布/获取GIL,它看起来像这样:

%inline %{
    void wrappedFunction(OriginalObject *o, <parameters>) {
    Py_BEGIN_ALLOW_THREADS
    o->originalFunction(<parameters>);
    Py_END_ALLOW_THREADS
}
%}
Run Code Online (Sandbox Code Playgroud)

此函数在原​​始C++中不存在,但在python模块中可用.这(几乎)正是我想要的.(我想要的是像python decorator那样包装原始方法)


Hen*_*son 6

不知道SWIG是什么我会尝试回答:)

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

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

    ~GILReleaser() {
        PyEval_RestoreThread(save);
    }

    PyThreadState* save;
};
Run Code Online (Sandbox Code Playgroud)

在您选择的代码块中,利用RAII发布/获取GIL:

{
    GILReleaser releaser;
    // ... Do stuff ...
}
Run Code Online (Sandbox Code Playgroud)


Mac*_*cke 0

您可以使用与 C 相同的 API 调用。没有区别。包含“python.h”并调用appoproate 函数。

另外,请查看 SWIG 是否没有类型映射或其他内容来指示 GIL 不应为特定函数保留。