Потоки C ++ программы в Python - PullRequest
1 голос
/ 17 марта 2019

У меня есть приложение Python, написанное на Kivy, которое использует программу C ++ для высокоскоростных вычислений, затем возвращает значение, и мое приложение Python использует это.

Программа C ++ упакована в PyBind11 и импортирована вприложение, а затем вызывается из Python.

Моя проблема в том, что когда программа C ++ выполняется, мое приложение останавливается на короткое время, и я все еще хотел бы, чтобы все происходило в фоновом режиме.

Я наивно думал, что это можно решить с помощью потокового вызова C ++, но, если подумать, проблема заключается в GIL.Должен ли я разблокировать GIL и как мне этого добиться?

1 Ответ

1 голос
/ 17 марта 2019

Не видя никакого кода, я могу только сделать вывод, что ваш код Python ждет завершения кода C ++, прежде чем делать что-либо еще.Это может означать одно или оба из следующих:

  • вы не разблокируете GIL в коде C ++

    • Согласно Global Interpreter Lock (GIL) - Разное - документация pybind11 2.2.3 , с pybind, это должно быть сделано так:

      py::gil_scoped_release release;
      long_running_method();
      py::gil_scoped_acquire acquire;
      

      Обратите внимание, что вам нужноGIL для доступа к любому механизму Python (включая возврат результата).Поэтому перед его выпуском убедитесь, что преобразовали все необходимые данные из типов Python в типы C ++.

  • у вас нет других активных Потоки Python , поэтому во время вызова C ++ никакие другие действия на Python не запрограммированы на выполнение каких-либо действий

...