Pybind11:为什么来自 Python 的异步调用不能在 C++ 中正确执行回调?

Pybind11: Why doesn't asyn call from Python execute the callbacks properly in C++?

我有一个 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 部分确实有效。但是客户端没有 activity 。我没有看到用 C++ 或 C# 生成的任何输出。回调正在运行并在控制台(C++ 或 C#)上输出所需的信息。然而,非异步函数 (start) 工作正常。

所以我的问题是,这是预期的行为吗?无论函数在 Python 中还是在其外部如何调用,这都不起作用吗?

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