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