Вы изначально не упомянули, что используете pyqt. Qt имеет встроенные сигналы и слоты для этой цели. Если вы запускаете свой поток с помощью QThread, то у него есть сигнал «готово», к которому ваш основной поток может быть подключен через слот. Если вам нужен еще больший контроль над результирующим сигналом, вы можете испустить пользовательский сигнал из потока с любым желаемым значением. Когда вы создаете поток, просто подключите его сигнал к слоту, который вы хотите использовать в качестве обратного вызова.
В противном случае вы бы заблокировали свой главный цикл обработки событий, если вы конкретно ожидаете в потоке.
Вот ссылка конкретно о новом стиле сигнала / слотов: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html
Теперь стало чрезвычайно легко создавать сигнал python с любой сигнатурой, которую вы хотите, и подключать его объектно-ориентированным способом к слоту.
Также в качестве дополнительного примечания о PyQt ... Некоторые другие ответы здесь предлагают создать цикл в главном потоке, который ожидает сбора ответов в очереди из отправленных потоков. Это по сути то, что делает PyQt. Когда вы запускаете приложение, основной поток переходит в цикл обработки событий. Этот цикл обработки событий обрабатывает события, которые складываются в его очереди событий. Существуют разные типы соединений сигнал / слот. Если ваши две конечные точки находятся в одном потоке, то будет установлено прямое соединение, и излучающий сигнал вызовет слот. Если они находятся в разных потоках, то я считаю, что он проходит цикл обработки событий, так что он может обрабатываться вне потока эмиттеров.