我有一个用Kivy编写的Python应用程序,该应用程序使用C ++程序进行高速计算,然后返回一个值,而我的Python应用程序使用该值。
C ++程序包装在PyBind11中,然后导入到应用程序中,然后从Python调用。
我的问题是,当C ++程序执行时,我的应用程序停止了一会儿,我仍然希望后台进行一些事情。
我天真地认为可以通过线程化C ++调用来解决此问题,但转而考虑,我认为问题出在GIL上。我必须解锁GIL,如何实现?
答案 0 :(得分:1)
没有看到任何代码,我只能推断出您的Python代码正在等待C ++代码完成,然后再执行其他操作。这可能意味着以下一项或两项:
您不是C ++代码中的unlocking the GIL
根据Global Interpreter Lock (GIL) — Miscellaneous — pybind11 2.2.3 documentation和pybind
,应该这样做:
py::gil_scoped_release release;
long_running_method();
py::gil_scoped_acquire acquire;
请注意,您需要GIL才能访问任何Python机器(包括返回结果)。因此,在发布之前,请确保将所需的所有数据从Python类型转换为C ++类型。
您没有任何其他活动的 Python 线程,因此在进行C ++调用时没有其他Python活动被编程为执行任何操作