gpt4 book ai didi

python - SWIG:使用自定义代码包装对 C++ 方法的调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:31 26 4
gpt4 key购买 nike

我正在尝试使用 SWIG Controller 从 C++ 调用 Python 代码。但是,如果代码在另一个线程中运行,我必须获取 GIL。我的代码大致如下所示(减去线程内容):

struct Callback {
virtual ~Callback() {}
virtual void call() {} // will be overwritten in Python
};

struct Foo {
Callback *c;
Foo(Callback* c) : c(c) {}
void doSomething() { c->call(); } // being called from another thread
};

python :

from demo import *
class MyCallback(Callback):
def call(*args):
print("python callback")

c = MyCallback()
f = Foo(c)
f.doSomething()

痛饮:

%module(directors="1", threads="1") demo
%feature("director");

%{
#include <test.h>
%}
%thread;
%include <test.h>

如何在调用 Python 回调之前获取 GIL?

详细来说,SWIG 的 threads 功能创建了在调用 C++ 代码时释放 GIL 的代码,但是当从 C++ 调用 Python 代码时,它不会被重新获取,所以这就是我想要的做。

调用堆栈如下所示:Python -> Foo.doSomething -> C++ -> Callback.call -> Python。

最佳答案

Non-Python created threads 中清楚地解释了如何获取 GUIL Python 手册中线程状态和全局解释器锁部分的小节。但是您说问题是如何从 SWIG 生成的代码中执行此操作。怎么样,添加到您的 SWIG .i 文件中:

struct PythonCallback: public Callback
{
virtual void call() {
getGIL();
lockedCall();
releaseGIL();
}

virtual void lockedCall() {} // will be overwritten in Python
};

您只需要公开 PythonCallback(不是 Callback)及其 lockedCall 方法,如果您愿意,可以通过 SWIG 将其重命名为 call %rename 指令。然后在 Python 中,您将从 PythonCallback 派生,并覆盖 call 方法(如果您 %rename,它实际上是 lockedCall 方法 它)。

关于python - SWIG:使用自定义代码包装对 C++ 方法的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com