Созвездие / Контекст :
Исполняемый файл C ++ (1), который динамически связывает общую библиотеку C ++ emb.so (2), которая, в свою очередь, запускает встроенный интерпретатор python ( 3) который вызывает пользовательские python функции (4).
Встраивание интерпретатора Python (3) происходит с использованием pybind11 . Вызов функции Python из C ++ можно упростить следующим образом:
py::module::import("test").attr("my_func")();
В исполняемом файле (1) есть главный l oop, в котором он может выполнять какую-то другую работу, но он будет вызывать python функция с регулярными интервалами.
Наблюдение :
- Вариант 1: Если я блокирую внутри функции python, код python выполняется плавно и быстро, но основной исполняемый файл l oop явно заблокирован
- вариант 2: если я создаю поток python внутри функции python для немедленного возврата из функции, основной исполняемый файл запущен , но код python работает очень медленно (я могу наблюдать итерации for-l oop с печатью одну за другой)
Вопрос :
Почему Вариант 2 такой медленный и как я могу это исправить?
Я предполагаю, что это как-то связано с GIL, и я попытался выпустить GIL в оболочке emb.so, прежде чем вернуться на главную l oop, но я не смог сделать это без gfault.
Есть идеи?