gpt4 book ai didi

c++ - 在单独的线程中调用 boost::python::object 作为函数

转载 作者:太空狗 更新时间:2023-10-29 23:17:08 26 4
gpt4 key购买 nike

我试图在 boost::python 的帮助下将一些 c++ 功能包装到 python 中。我在使特定的回调机制起作用时遇到了一些麻烦。以下代码片段解释了我正在尝试做的事情:

//c++ side
class LoopClass {

public:
//some class attributes

void call_once(std::function const& fun) const;
};

void callOnce(LoopClass& loop, boost::python::object const& function) {

auto fun = [&]() {
function();
};

loop->call_once(fun);
}

boost::python::class_<LoopClass>("LoopClass")
.def("call_once", &callOnce);


//python side
def foo():
print "foo"

loop = LoopClass()
loop.call_once(foo)

事情是这样的:函数 call_once() 接受一个 std::function 并将其放入队列中。 LoopClass 维护一个在单独线程中运行的永恒循环,并在某个时刻处理存储的回调函数队列。要将 boost::python::object 视为函数,必须显式调用转换运算符。这就是为什么我没有直接包装 call_once(),而是编写了一个小的转换函数 callOnce(),它通过 lambda 转发转换运算符调用。

无论如何,当我尝试运行此代码时,访问 boost::python::object 会因段错误而失败。我想在线程之间共享 python 对象并不是那么容易。但如何做到这一点?

在此先感谢您的帮助!

更新

我试着听从@JanneKarila 的建议

See Non-Python created threads. – Janne Karila

我想这是找到解决方案的正确点,但不幸的是我无法弄清楚如何应用它。

我试过了

void callOnce(LoopClass& loop, boost::python::object const& function) {

auto fun = [&]() {
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();

function();

PyGILState_Release(gstate);
};

loop->call_once(fun);
}

这是行不通的。我是漏掉了什么还是太笨了?

最佳答案

你调用过 PyEval_InitThreads() 吗? ?

如果是这样,也许这 http://www.codevate.com/blog/7-concurrency-with-embedded-python-in-a-multi-threaded-c-application piece 有帮助吗?

关于c++ - 在单独的线程中调用 boost::python::object 作为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116656/

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