我有一个用C ++编写的库,我使用SWIG包装并在python中使用。通常有一个类只有很少的方法。问题是调用这些方法可能很耗时 - 它们可能会挂起我的应用程序(调用这些方法时不会释放GIL)。所以我的问题是:
为这些方法调用释放GIL的最简单方法是什么?
(据我所知,如果我使用了一个C库,我可以使用一些额外的C代码来包装它,但在这里我使用C ++和类)
答案 0 :(得分:8)
真正的问题是SWIG没有很好地记录(我看到了使用changelog进行搜索的提示;))。
好的,我发现我可以在SWIG中使用内联函数并使用宏来发布/获取GIL,它看起来像这样:
%inline %{
void wrappedFunction(OriginalObject *o, <parameters>) {
Py_BEGIN_ALLOW_THREADS
o->originalFunction(<parameters>);
Py_END_ALLOW_THREADS
}
%}
此函数在原始C ++中不存在,但在python模块中可用。这(几乎)正是我想要的。 (我想要的是像python decorator那样包装原始方法)
答案 1 :(得分:6)
不知道SWIG是什么我会尝试回答:)
使用类似的东西来发布/获取GIL:
class GILReleaser {
GILReleaser() : save(PyEval_SaveThread()) {}
~GILReleaser() {
PyEval_RestoreThread(save);
}
PyThreadState* save;
};
在您选择的代码块中,使用RAII发布/获取GIL:
{
GILReleaser releaser;
// ... Do stuff ...
}
答案 2 :(得分:1)
您可以使用与C相同的API调用。没有区别。包括“python.h”并调用appoproate函数。
另外,看看SWIG是否没有类型图或某些东西来指示不为特定功能保留GIL shuold。