在 python 中线程化 C++ 程序
Threading a c++ program in python
我有一个用 Kivy 编写的 Python 应用程序,它使用 C++ 程序进行高速计算,然后它 returns 一个值,我的 Python 应用程序使用它。
C++ 程序封装在 PyBind11 中并导入到应用程序中,然后从 Python 调用。
我的问题是当执行 C++ 程序时,我的应用程序会停止一小会儿,但我仍然希望在后台继续进行。
我天真地认为这可以通过线程化 C++ 调用来解决,但转念一想,我认为问题出在 GIL 上。我必须解锁 GIL 吗?我该如何实现?
没有看到任何代码,我只能推断您的 Python 代码正在等待 C++ 代码完成,然后再做其他事情。这可能意味着以下其中一项或两项:
你不是unlocking the GIL在C++代码中
根据 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 线程,因此没有其他 Python activity 编程在进行 C++ 调用时执行任何操作
我有一个用 Kivy 编写的 Python 应用程序,它使用 C++ 程序进行高速计算,然后它 returns 一个值,我的 Python 应用程序使用它。
C++ 程序封装在 PyBind11 中并导入到应用程序中,然后从 Python 调用。
我的问题是当执行 C++ 程序时,我的应用程序会停止一小会儿,但我仍然希望在后台继续进行。
我天真地认为这可以通过线程化 C++ 调用来解决,但转念一想,我认为问题出在 GIL 上。我必须解锁 GIL 吗?我该如何实现?
没有看到任何代码,我只能推断您的 Python 代码正在等待 C++ 代码完成,然后再做其他事情。这可能意味着以下其中一项或两项:
你不是unlocking the GIL在C++代码中
根据 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 线程,因此没有其他 Python activity 编程在进行 C++ 调用时执行任何操作