Я интегрирую сторонний пакет C ++ в приложение Python, используя SWIG .Пакет подключается к проприетарному API через сеть и получает обновления.Весь процесс заключается в том, что python создает экземпляр объекта C ++, вызывает его функции, чтобы установить его, и затем ждет обновлений.
Я реализовал механизм обратного вызова для обновлений, используя функция директоров SWIG ,и при тестировании из python или из функций C ++, вызываемых python, это работает хорошо.А именно, я могу наследовать класс C ++ в Python, вызывать его виртуальные функции из C ++ и видеть, что код python имеет приоритет и выполняется.
Проблема:
Когда я получаюобновления из сети, которые я получаю:
The thread 'Win32 Thread' (0x1f78) has exited with code 0 (0x0).
Unhandled exception at 0x1e0650cb in python.exe: 0xC0000005: Access violation writing location 0x0000000c.
Это исключение выдается изнутри python27.dll
при вызове функции обратного вызова.
Мое подозрение таково: IВы нарушили GIL
AFAIU. Обновления приходят из другого потока и вызывают код Python, используя этот поток.
На данный момент я в растерянности.Функция директора SWIG ограничена только потоками, инициированными в python (т.е. из потоков, управляемых python)?
Как мне обойти это?Как заставить обновления с C ++ на python?Можно ли вообще использовать SWIG?
Должен ли я использовать совершенно другой подход?
Я открыт для любых предложений по этому вопросу ...