Сокет PyZMQ не может быть отправлен при создании в функции

С PyZMQ, когда я пытаюсь создать сокет внутри функции и отправить с ним сообщение, сообщение никогда не будет получено.

context = zmq.Context()

def sender():                                          
    sock = context.socket(zmq.PUB)
    sock.connect("tcp://localhost:44444")
    sock.send("status good")

sender()

Однако, если я создаю сокет в глобальной области, он работает:

context = zmq.Context()
sock = context.socket(zmq.PUB)
sock.connect("tcp://localhost:44444")
sock.send("status good")

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

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


person orodbhen    schedule 18.08.2015    source источник


Ответы (1)


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

context = zmq.Context()

def sender():                                          
    sock = context.socket(zmq.PUB)
    sock.connect("tcp://localhost:44444")
    time.sleep(1)
    sock.send("status good")

sender()

Любые сообщения, отправленные до того, как соединение будет полностью установлено, будут просто удалены.

person orodbhen    schedule 19.08.2015