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++ 端执行此操作。
我有一个 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++ 端执行此操作。