SWIG C ++ Полиморфизм Python и многопоточность

Я интегрирую сторонний пакет 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 при вызове функции обратного вызова.
Я подозреваю следующее: Я нарушил GIL
AFAIU, обновления приходят из другого потока и вызывают код Python, используя этот поток.

На данный момент я в растерянности. Ограничена ли функция директора SWIG только потоками, инициированными внутри python (то есть из потоков, управляемых python)?
Как мне обойти это? Как мне вызвать обновления с C ++ до Python? Возможно ли использование SWIG?
Следует ли мне использовать совершенно другой подход?

Я открыт для любых предложений по этому поводу ...

5
задан Jonathan 5 March 2012 в 15:35
поделиться