Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой вид межпроцессового взаимодействия выбрать? Посоветуйте что лучше применить 
V
    Опции темы
VinniPuhh
Дата 10.5.2012, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2011

Репутация: нет
Всего: нет



День добрый. Есть такая архитектура программы (менять нельзя):
- Есть главный процесс, в нем интерфейс (PyQt и Web-шлюз) и управление другими процессами.
- Есть дочерние процессы, обрабатывающие задачу. Они порождаются главным процессом. Как именно порождаются (exec, fork ) - не важно.

Нужно обеспечить достаточно тесный уровень взаимодействия между главным и дочерними. 
1) Главный процесс может менять параметры обработки, посылая довольно большой список значений (словарь с параметрами)
2) Главный процесс должен в своем интерфейсе показывать что творится дочерних, то есть несколько раз в секунду получать от них массивы с информацией для показа оператору.
3) Главный процесс может быть уничтожен оператором а потом вновь запущен, надо возобновить управление запущенными дочерними (информация и PIDы дочерних можно хранить в БД, искать процессы в ОС не надо smile )

Посоветуйте плз., какой механизм взаимодействия тут лучше всего применить? 
 - Именованные каналы - долго, так как это все будет через физические файлы (поправьте меня, если ошибаюсь)
 - Анонимные каналы (pipe) - не сохранятся при рестарте главного процесса
 - Через БД (ну допустим таблица с переменными) - еще дольше чем через каналы-файлы, нагрузка думаю будет очень высока
 - Из рассмотренных вариантов есть еще модуль mmap, пока не работал с ним, решил сначала спросить совета. Кстати, он допускает рестарт одного из процессов?
 - Можно через sockets - вроде неплохой вариант

В общем прошу совета, кто решал подобную задачу, как тут удобней всего сделать.
Спасибо


Это сообщение отредактировал(а) VinniPuhh - 10.5.2012, 12:43
PM MAIL   Вверх
Ch0bits
Дата 10.5.2012, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Все это велосипеды, тебе нужен обычный диспетчер сообщений. ZeroMQ быстрейший из них, но порог вхождения довольно высок. Почитай документацию по нему, многих велосипедистов она буквально "просветляет".
PM WWW   Вверх
rsm
Дата 10.5.2012, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



А ещё есть lcm smile Он намного проще zeromq, но тоже достаточно мощный и шустрый, обеспечивает лёгкий и прозрачный объектный обмен между гетерогенными программами (например, на С и Java или на Python и С#).
PM MAIL   Вверх
Ch0bits
Дата 10.5.2012, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



VinniPuhh, слушай, а ты не смотрел модуль multiprocessing? Может он станет годной заменой твоим костылям?  smile 

Это сообщение отредактировал(а) Ch0bits - 10.5.2012, 19:35
PM WWW   Вверх
VinniPuhh
Дата 11.5.2012, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2011

Репутация: нет
Всего: нет



Цитата

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


Цитата

А ещё есть lcm  Он намного проще zeromq, но тоже достаточно мощный и шустрый, обеспечивает лёгкий и прозрачный объектный обмен между гетерогенными программами


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


Цитата

VinniPuhh, слушай, а ты не смотрел модуль multiprocessing? Может он станет годной заменой твоим костылям?


Представляешь, смотрел smile 
Конечно вполне возможно что плохо смотрел, но я не знаю как используя этот модуль обеспечить пункт три задания "Главный процесс может быть уничтожен оператором а потом вновь запущен, надо возобновить управление запущенными дочерними". Походу там в принципе таких средств нет.  Если такая фишка есть (подключиться к уже запущенному ранее своему процессу, имея его PID и внутренний auth key (эти auth key сам модуль генерит)) - расскажи как, это разом снимет вообще все проблемы.
PM MAIL   Вверх
Ch0bits
Дата 11.5.2012, 18:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Цитата(VinniPuhh @  11.5.2012,  13:09 Найти цитируемый пост)
Главный процесс может быть уничтожен оператором а потом вновь запущен, надо возобновить управление запущенными дочерним

Не знаю какую ОС ты используешь, видимо линукс, но там убийство отца влечет смерть всех сыновый. Вообще конечно странное требование, ты уверен что без убийства отца не обойтись?

Цитата(VinniPuhh @  11.5.2012,  13:09 Найти цитируемый пост)
внутренний auth key

Может быть ты имел ввиду какой-нибудь внутренний id задачи, которую параллельно решают дети. Я не знаю характер приложения. Может быть этот id передавать через командную строку, например так управляются процессы google chrome.

Цитата(VinniPuhh @  11.5.2012,  13:09 Найти цитируемый пост)
надо возобновить управление запущенными дочерними

Т.е. дети без отца слепы, тут уже их смысл меркнет, если они не могут работать автономно, нафига им жить? 
Я все-таки склоняюсь к мысли, что при смерти отца должны умереть все, а то что задача прервана - вина оператора, он знал состояние процесса.

Принцип KISS - keep it simple stupid! Не надо усложнять. Усложнение задачи в 2 раза усложняет её реализацию в 4 раза.

Это сообщение отредактировал(а) Ch0bits - 11.5.2012, 18:57
PM WWW   Вверх
VinniPuhh
Дата 12.5.2012, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2011

Репутация: нет
Всего: нет



Цитата(Ch0bits @  11.5.2012,  18:51 Найти цитируемый пост)
Не знаю какую ОС ты используешь, видимо линукс, но там убийство отца влечет смерть всех сыновый.

Странное утверждение....
Код

import os, time, signal
def subprocess():
    time.sleep(10)
    print 'Hello from subprocess'

signal.signal(signal.SIGCHLD, signal.SIG_IGN)
pid = os.fork()
if not pid:
    time.sleep(5)
    print 'Main process exit!'
    exit()
else: subprocess()




Цитата(Ch0bits @  11.5.2012,  18:51 Найти цитируемый пост)
Цитата(VinniPuhh @  11.5.2012,  13:09 )
внутренний auth key

Может быть ты имел ввиду какой-нибудь внутренний id задачи
[/quote]

Нет-нет, это именно сам модуль генерит, я надеялся что как раз для моего случая, но к сожалению ответа не нашел:
http://docs.python.org/library/multiprocessing.html
Код

authkey
The process’s authentication key (a byte string).

When multiprocessing is initialized the main process is assigned a random string using os.random().




Цитата(Ch0bits @  11.5.2012,  18:51 Найти цитируемый пост)
Т.е. дети без отца слепы, тут уже их смысл меркнет, если они не могут работать автономно, нафига им жить? 
Я все-таки склоняюсь к мысли, что при смерти отца должны умереть все, а то что задача прервана - вина оператора, он знал состояние процесса.


Ну смотри. Выполняется обработка большой задачи. Данные для обработки "куска" задачи берутся процессами из БД и интернета. Работают "сыновья" по нескольку часов, а то и суток. 
Оператор меняет там количество потоков обработки внутри каждого процесса, другие разные настройки.
Очень удобно, чтобы оператор закрыл управляющий интерфейс, а потом снова открыл и поменял что ему нужно.
Да, конечно, если бы все так как описано сейчас - писать тупо отчет о работе в БД, и оттуда же читать параметры. НО интерфейс - красивые графические окошки, в которых надо в реальном времени показывать чем занимается каждый поток. Через БД такое гонять - очень накладно.
Еще вариант - не "убивать" родителя по закрытию а просто спрятать форму. Но тогда неуниверсальна обработка через www-шлюз, там ребята на django пишут, надо чтобы этот django процесс коннектился к "сыновьям" а потом помирал... короче ТЗ сделано именно так из этих 3-х пунктов совершенно не зря smile 


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

PS Если кто в будущем будет сталкиваться - мы выбрали модель, что каждый порожденный процесс открывает для управления собой сокеты, и согласован протокол управления через них. Как это покажет себя в жизни - посмотрим smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.