Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2012 11:39:09

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Доброго времени суток! Обрисую вкратце проблему, есть PyQt-класс интерфейса,
внутри этого класса порождаются новые потоки
в которых выполняются определенные задачи, которые должны возвращать данные.
Так как работать с GUI из другого потока нельзя, то взаимодействие между потоками происходит
с помощью сигналов\слотов PyQT. При завершении работы в одном из подпотоков к родителю подключается слот,
эммитится сигнал и сразу же отключается (названия сигналов различные, так как подзадачки выполняют разные действия -
запросы к базе данных).

Данная система обмена сообщениями работает, проблем нет.

Но интересует какой-нибудь вариант, позволяющий организовать подобное взаимодействие между потоками на чистом питоне
(в других задачах также требуется выполнение обработки данных в главном потоке, а не вызов метода из дочернего потока для обработки)

Прежде думал взять потокобезопасную очередь (сейчас она уже задействована), в дочерних потоках заполнять ее, а в глвном потоке
периодически опрашивать наличие данных в очереди. Однако здесь меня смущает наличие именно опроса по таймеру, не хочется с этим
связываться с таймером так как длительность работы подзадачек может быть различной.

Существует ли какие-нибудь аналоги PyQt сигналов\слотов на чистом питоне,
для оповещения главного потока, что необходимо выполнить определенный метод??

Например в Objective-C есть специальные методы performSelectorInBackground, вызываемый из главного потока и performSelectorInMainThread вызываемый в дочернем потоке при завершении работы задачи.



Офлайн

#2 Март 13, 2012 12:15:48

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Тема вдоль и поперек уже изъезжена, но информацию по взаимодействию с помощью сообщений\сигналов найти не смог



Офлайн

#3 Март 14, 2012 19:40:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Взаимодействие между потоками с помощью сигналов

Проблема в том, что Qt event loop желает знать только о Qt объектах. Поэтому приходится опрашивать по таймеру. QApplication не имеет виртуальной функции onIdle (довольно распространенной в разных GUI) — остается только таймер.



Офлайн

#4 Март 14, 2012 21:43:02

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Кажется нашел решение в стандртной библиотеке Python. Модуль concurrent.futures позволяет выполнить определенную функцию в фоновом потоке, организуя взимодействие с потоками на более высоком уровне.

with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(pow, 323, 1235)
print(future.result())

возврщемый объект future имеет метод add_done_callback(fn)

“Added callables are called in the order that they were added and are always called in a thread belonging to the process that added them.”
Если я правильно понял, то этот коллбек будет вызываться в том потоке, в котором его назначили (в моем случае в главном)

Пока возможности нету проверить



Офлайн

#5 Март 15, 2012 06:27:03

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Взаимодействие между потоками с помощью сигналов

Нет. В потоке-обработчике. Главный поток не имеет средств получить управление тогда, когда рабочий поток что-то посчитал.



Офлайн

#6 Март 15, 2012 18:15:12

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Может знаете какие-нибудь сторонние python- библиотеки, способные организовать подобное взаимодействие между потоками с помощью сигналов, не таская за собой библиотеку pyqt? мне кажется довольно распространенный задача



Офлайн

#7 Март 15, 2012 18:19:41

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Что-нибудь в духе организации очереди задач внутри объекта класса, если не ошибаюсь, так сделано в qt



Офлайн

#8 Март 17, 2012 02:25:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Взаимодействие между потоками с помощью сигналов

Проблема в интеграции этого стороннего кода с Qt event loop.
Qt активно такому сопротивляется.
Если же вам подходит приложение без Qt GUI — есть варианты.



Офлайн

#9 Март 17, 2012 19:09:54

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Да, да, интересуют варианты без GUI. Случаем не работали с Celery, времени посмотреть не было детально, но вроде бы под эти цели создавалось.



Офлайн

#10 Март 18, 2012 00:56:05

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

multiprocesing.apply_async с колбэком - это часом не то, что вы ищете?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version