真正的问题是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那样包装原始方法)
不知道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)
您可以使用与 C 相同的 API 调用。没有区别。包含“python.h”并调用appoproate 函数。
另外,请查看 SWIG 是否没有类型映射或其他内容来指示 GIL 不应为特定函数保留。