lje*_*iot 3 c++ python multithreading gil
我有一个用 Kivy 编写的 Python 应用程序,它使用 C++ 程序进行高速计算,然后返回一个值,我的 Python 应用程序使用该值。
C++ 程序包装在 PyBind11 中并导入到应用程序中,然后从 Python 调用。
我的问题是,当执行 C++ 程序时,我的应用程序会停止一小会儿,但我仍然希望事情在后台进行。
我天真地认为这可以通过线程化 C++ 调用来解决,但转念一想,我认为问题出在 GIL 上。我必须解锁 GIL,如何才能实现这一目标?
在看不到任何代码的情况下,我只能推断出您的 Python 代码正在等待 C++ 代码完成,然后再执行其他操作。这可能意味着以下任一或两者:
\n\n你没有解锁C++ 代码中的GIL
\n\n根据Global Interpreter Lock (GIL) \xe2\x80\x94 Miscellaneous \xe2\x80\x94 pybind11 2.2.3 文档,与pybind,应该这样做:
py::gil_scoped_release release;\nlong_running_method();\npy::gil_scoped_acquire acquire;\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,您需要 GIL 才能访问任何 Python 机器(包括返回结果)。因此在发布之前,请确保将所需的所有数据从Python类型转换为C++类型。
您没有任何其他活动的Python线程,因此在 C++ 调用正在进行时,没有编程其他 Python 活动来执行任何操作