【问题标题】:Threading a c++ program in python在python中线程化一个c++程序
【发布时间】:2019-08-07 21:25:26
【问题描述】:

我有一个用 Kivy 编写的 Python 应用程序,它使用 C++ 程序进行高速计算,然后它返回一个值,我的 Python 应用程序使用它。

C++ 程序封装在 PyBind11 中并导入到应用程序中,然后从 Python 中调用。

我的问题是当 C++ 程序执行时,我的应用程序会停止一小会儿,我仍然希望在后台进行。

我天真地认为这可以通过线程化 C++ 调用来解决,但仔细想想,我认为问题在于 GIL。我必须解锁 GIL,我该如何实现?

【问题讨论】:

  • 如果你有一个多线程应用程序,那么如果你的 c++ 代码没有解锁 GIL,你就不会从多线程中获得太多的速度
  • 请添加一个minimal reproducible example,显示您的 C++ 和 Python 代码如何交互以及如何处理线程。否则我们在这里进行毫无意义的讨论,因为不知道,我们不能说任何具体的事情。

标签: python c++ multithreading gil


【解决方案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 活动被编程来执行任何操作

【讨论】:

  • 太棒了,两个答案都是正确的!我已经实现了第一个答案,并且我正在决定在计算发生时要进行的活动。非常感谢您的回复,我会投赞成票,但我还没有所需的声誉...:/ !!
  • @ljelliot 你可以accept 代替。
猜你喜欢
  • 2021-03-04
  • 2013-10-10
  • 2012-07-14
  • 2020-11-09
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多