Процесс Python 2 связывается по сокету - PullRequest
0 голосов
/ 05 января 2012

Мне нужно 2 процесса для общения.Любой может бежать один, но когда они бегут вместе, они должны общаться.Они посылают только несколько байтов друг другу каждую минуту.Ни один из них не рассматривается как «хост» или «клиент».

Я пытался создать класс, который обрабатывает это в фоновом режиме.Например, сначала он пытается подключиться к сокету, если это не удается, он пытается прослушать и т. Д. Когда одна программа завершает свою работу, другая берет на себя прослушивание и т. Д. После долгой борьбы с этим я отказался.Слишком много ошибок, и я не могу заставить их работать надежно.

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

Ответы [ 2 ]

3 голосов
/ 05 января 2012

Используйте 0mq , с двумя парами разъемов PUB / SUB.

2 голосов
/ 05 января 2012

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

В следующем примере показано, как создается именованный канал и как его открывать для чтения и записи в двух разных процессах:

import os

pipe_name = '/tmp/ipc'

if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)
    try:
        with open(pipe_name) as f:
            print 'Received:', f.read()
        with open(pipe_name, 'w') as f:
            message = 'Goodbye World!'
            print 'Sending:', message
            f.write(message)
    finally:
        os.remove(pipe_name)
else:
    with open(pipe_name, 'w') as f:
        message = 'Hello World!'
        print 'Sending:', message
        f.write(message)
    with open(pipe_name) as f:
        print 'Received:', f.read()

Первый процесс будет:

  • Создать именованный канал
  • Получить сообщение
  • Отправить еще одно сообщение
  • Удалить трубу

в то время как второй процесс будет просто:

  • Отправить сообщение
  • Получить еще одно сообщение

Если вы выполните приведенный выше пример в двух разных терминалах, в первом вы получите:

Received: Hello World!
Sending: Goodbye World!

и во втором:

Sending: Hello World!
Received: Goodbye World!

Примечание: это всего лишь пример. Если вам нужна двунаправленная связь, было бы удобнее использовать два именованных канала вместо открытия только одного для чтения / записи, когда вам нужно получать / отправлять сообщения.

...