Pybind11:为什么python的asyn调用不能在C ++中正确执行回调?

问题描述 投票:0回答:1

我有一个像这样实现的python方法:

def start(self):
    try:
        self.is_running = True
        self._main_loop()

    except Exception as ex:
        path='exceptions-servicecore.log'
        track = traceback.format_exc()
        exception_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
        with open(path, 'a') as f:
            f.writelines(f'\n{exception_time} : exception occured {ex.args} \n{track}')

def start_async(self):
    st = threading.Thread(target=self.start) 
    st.start()

[_main_loop()然后在这里运行一堆命令并执行从C ++ / C#等发送的回调。使用Pybind11我只需要像这样调用start_async

this->startFuncAsync = this->obj.attr("start_async");
...
CORE_API void Core::Start(bool async)
{
    try
    {
        if (async)
        {
            this->startFuncAsync();
        }
        else
        {
            this->startFunc();
        }
    }
    catch (std::exception ex)
    {
        std::cout << ex.what() << std::endl;
    }
}

但是看来,它无法正常运行。它在Python中可以正常工作,但是在C ++或C#上面调用C++函数时,它不会显示任何输出!当我将它们的执行记录到文本文件中时,调用回调的python部分确实起作用。但是客户端没有活动。我看不到C ++或C#会产生任何输出。回调正在工作,并在控制台(C ++或C#)上输出所需的信息。但是,非异步功能(start)可以正常工作。

所以我的问题是,这是预期的行为吗?不管该函数在Python中还是在外部调用,都应该不起作用吗?

python c++ cpython pybind11
1个回答
0
投票

此问题似乎与Pybind11有关。也就是说,只有一个执行线程可以工作,并且所有操作都必须在同一线程下执行。如果像在这里(开始)那样在python中作为单独的线程启动方法,则在c ++中调用其他方法将使用不同的线程,因此您可以与之交互,它将变得像僵尸线程,因为您不会能够与之互动甚至停止。逻辑方法是在您可以控制线程的C ++端执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.