Сбой при отображении окна PyQt4 после импорта расширения Python, использующего OpenMP

1

Я разрабатываю приложение python, которое использует модуль расширения C, который я также разработал сам. Модуль расширения выполняет тяжелое хрустение и использует OpenMP. Недавно я добавлял некоторые компоненты графического интерфейса в мое приложение Python с помощью PyQt4. Однако, когда я показываю окно, приложение падает до того, как окно будет полностью нарисовано (окно появляется очень коротко). Я смог отследить проблему: когда я скомпилирую свое C-расширение с номером без поддержки OpenMP, окно отображается отлично, и все работает. Я предполагаю, что это имеет какое-то отношение к потоковым материалам между OpenMP и Qt. Кто-нибудь сделал подобное наблюдение?

Теги:
qt
openmp
pyqt
python-c-extension

3 ответа

1
  1. Убедитесь, что расширение OpenMP number crunching не имеет условий гонки.
  2. Избегайте обновления окон или любых других графических интерфейсов из нескольких потоков - используйте #pragma omp single или #pragma omp master для такого рода материалов.
  3. Если у вас есть переменная/обратная связь с кодом python, убедитесь, что все потоки завершили то, что они должны были до изменения переменной или выполнения обратного вызова.

Нити из QT и поток из OpenMP - это совершенно разные потоки, поэтому это не должно создавать никаких проблем.

  • 0
    Дело в том, что я даже ничего не называю в своем C-расширении, и приложение PyQT все равно ломается. Таким образом, я не думаю, что есть какие-либо условия гонки. Мое приложение аварийно завершает работу, когда я вызываю метод exec приложения QApplication без вызова какого-либо кода на C раньше.
1

Возможно, что-то в PyQT небезопасно.

Может быть, вы можете попробовать использовать zeromq с помощью inproc или ipc, например.

1

В качестве обходного пути вы можете создать автономную программу с использованием openmp и программу Qt frontend. и заставить их общаться с помощью tcp-сокета или что-то знакомое (dll - это еще один вариант?).

Дело в том, что изолировать разные модули, если один из модулей выходит из строя, вы знаете, какая часть терпит неудачу. как одна целая большая программа, трудно найти один дикий указатель...

  • 0
    Хорошее предложение, но это не вариант

Ещё вопросы

Сообщество Overcoder
Наверх
Меню