проблема при реализации неблокирующего механизма публикации с zeromq - PullRequest
1 голос
/ 07 ноября 2011

Я хотел бы связать два процесса (отправитель и получатель), используя zeromq.Теперь, если процесс-получатель не запущен, я бы хотел, чтобы процесс-отправитель продолжал свое выполнение, даже если сообщение потеряно.

Пытаясь реализовать его с использованием шаблона PUB-SUB, я заметил, что если приемник не работает, отправитель кладет трубку.Например, в следующем исходном коде отправителя:

import zmq

context = zmq.Context()
sender = context.socket(zmq.PUB)
sender.connect("tcp://localhost:5555")

sender.send("Sending to nobody", NOBLOCK)

print "Msg sent"

, когда получатель не работает, сообщение «Сообщение отправлено» никогда не печатается, и отправитель остается в «sender.send» («Отправка никому»)НОБЛОК) "навсегда.Кроме того, я попытался проверить, работает ли получатель, или не получает возврат функции connect , но в обоих случаях это всегда "None".

Я использую Python 2.6.5 и zeromq 2.1

Кто-нибудь знает, что происходит, или альтернативное решение?(Я пробовал использовать PULL-PUSH и REQ-REP, но схожие результаты)

Большое спасибо заранее

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

После исправления образца:

import zmq

context = zmq.Context()
sender = context.socket(zmq.PUB)
sender.connect("tcp://localhost:5555")

sender.send("Sending to nobody", zmq.NOBLOCK)

print "Msg sent"

Я вижу такое поведение, что фраза "Msg sent" напечатана, но после этого скрипт зависает и фактически никогда не завершается.Проблема здесь в том, что он зависает при системном вызове close().

Вы можете изменить это поведение, установив параметр LINGER в своем сокете:

sender = context.socket(zmq.PUB)
sender.setsockopt(zmq.LINGER, 100)

Это значениеЗдесь задерживается время в миллисекундах.См. Справочную страницу для zmq_setsockopt для получения дополнительной информации.Практическое влияние этого состоит в том, что ZMQ будет ждать только задержку миллисекунд, прежде чем закрывать сокет.

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

3 голосов
/ 07 ноября 2011

Вы можете легко изменить: sender.connect("tcp://localhost:5555") на sender.bind("tcp://localhost:5555") и наоборот на приемнике.

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

...