Python межпроцессное взаимодействие - PullRequest
3 голосов
/ 07 февраля 2011

У меня есть приложение Python (с графическим интерфейсом, использующим PyQt4), которое порождается пользователем в нескольких случаях.Приложение используется для выполнения некоторых длительных задач (от нескольких часов до нескольких дней), поэтому я готов добавить дополнительное приложение для «мониторинга», которое будет выполнять такие функции:

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

Один из подходящих способов работы - это RPyC , единственная проблема, кажется, работает только через сокеты TCP, как и большинствоБиблиотеки RPC я нашел.Но это приводит к необходимости открывать несколько ненужных сокетов, прослушивающих только на локальном хосте, и создавать какой-то механизм распределения портов, чтобы избежать двух процессов, пытающихся прослушивать один и тот же порт.И затем монитору нужен список портов, которые нужно записать куда-нибудь, или найти процессы, прослушивающие порты TCP, и попытаться выяснить, являются ли они экземплярами правильного приложения или ot.Звучит как беспорядок.

Самый хороший способ управления связью, о котором я мог подумать в данный момент, - это иметь несколько сокетов Unix, скажем, в /var/run/myapp/myapp-.sock,и затем создание модуля, который выполняет всю грязную работу, обнажая некоторые методы, такие как listMyApps() и getMyApp(pid), возвращая первый список pids, второй - объект, который можно использовать для связи с этим приложением.

Теперь я смотрю на лучший способ сделать это .. На самом деле, ничего не было сделано для управления RPC через сокеты Unix?Звучит немного странно для меня, но я не смог найти ничего подходящего ..

Есть предложения?

ПРИМЕЧАНИЕ: Я не хочупоменять местами (приложения являются клиентом одного сервера мониторинга), чтобы избежать проблем в случае сбоя мониторинга приложений и позволить мне свободно создавать другие приложения, которые подключаются к этим сокетам и делают запросы.

ПРИМЕЧАНИЕ: Безопасность не является проблемой, так как все это работает в частной, закрытой и защищенной сетью сети :), кроме того, запросы выполняются на локальном хосте только доверенными пользователями.

Ответы [ 3 ]

2 голосов
/ 07 февраля 2011

Другой способ - это создать некую систему управления заданиями, и вместо того, чтобы приложение запускало свои собственные процессы, оно должно было зарегистрировать задания для запуска, которые выполняют задачу. Затем система управления заданиями будет отслеживать запущенные задания. В качестве бонуса, с этим дизайном вы можете распространить работу на множество машин в какой-то момент в будущем.

2 голосов
/ 17 февраля 2011

Полагаю, я нашел подвиг с помощью dbus-python .Мне удалось интегрировать его с mainloop Qt4, хотя на сайте говорят, что поддерживается только glib (я думаю, эта страница не обновляется).Я только что выполнил тест qick, и он, кажется, работает хорошо (я просто создал несколько фиктивных функций на шине с именем com.example.myapp.<pid> и перечислил экземпляры и соединился с внешним клиентом).RPyC работает через TCP только для связи между «управляющим» управляющим приложением и «управляющим» приложением, которое действует как «переключение» между экземплярами на машине.

+-------------------+                    
| MASTER APP        |                    +--------------------+
| on my workstation |------ RPyC --------| Server#0 Manager   |
+-------------------+                    +--------------------+
      |                                      | | |
    RPyC                                     | | '-- dbus ---[INSTANCE #0]
      |                                      | '--- dbus ---[INSTANCE #1]
   +--------------------+                    '---- dbus ---[INSTANCE #2]
   | Server#1 Manager   |
   +--------------------+
      | | |
      | | '-- dbus ---[INSTANCE #0]
      | '--- dbus ---[INSTANCE #1]
      '---- dbus ---[INSTANCE #2]

Если кому-то интересно, просто дайте мне знать, и я также опубликую некоторые примеры кода / более подробную информацию ..

2 голосов
/ 07 февраля 2011

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

Не совсем.Во-первых, так работает большинство межпроцессных коммуникаций через сокеты.Либо сокеты TCP, либо сокеты UNIX.По сути, это (не совсем) то, что вы делаете, когда передаете стандарт и т. Д.

Вы также можете использовать сигналы ОС.Хотя вы должны иметь в виду, что только основной поток каждого процесса может выполнять обработку сигналов, поэтому вы должны быть осторожны, чтобы не блокировать это.сокетные соединения.

...