Как использовать транспорты Zeromq inproc и ipc? - PullRequest
17 голосов
/ 13 декабря 2011

Я новичок в ZERMQ. ZeroMQ имеет транспорт TCP, INPROC и IPC. Я ищу примеры использования Python и InProc в Winx64 и Python 2.7, которые также могут быть использованы для Linux.

Кроме того, я искал методы транспорта UDP и не могу найти примеры.

Единственный пример, который я нашел, это

import zmq
import zhelpers

context = zmq.Context()

sink = context.socket(zmq.ROUTER)
sink.bind("inproc://example")

# First allow 0MQ to set the identity
anonymous = context.socket(zmq.XREQ)
anonymous.connect("inproc://example")
anonymous.send("XREP uses a generated UUID")
zhelpers.dump(sink)

# Then set the identity ourself
identified = context.socket(zmq.XREQ)
identified.setsockopt(zmq.IDENTITY, "Hello")
identified.connect("inproc://example")
identified.send("XREP socket uses REQ's socket identity")
zhelpers.dump(sink)

Вариант использования, о котором я думаю: UDP, как распространение информации. Тестирование Push / Pull с использованием TCP выполняется быстрее или будет быстрее.

Вот пример теста> ..............

Сервер:

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("inproc://example2")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print "Received request: ", message

    #  Do some 'work'
    time.sleep (1)        #   Do some 'work'

    #  Send reply back to client
    socket.send("World")

Клиент:

import zmq

context = zmq.Context()

#  Socket to talk to server
print "Connecting to hello world server..."
socket = context.socket(zmq.REQ)
socket.connect ("inproc://example2")

#  Do 10 requests, waiting each time for a response
for request in range (1,10):
    print "Sending request ", request,"..."
    socket.send ("Hello")

    #  Get the reply.
    message = socket.recv()
    print "Received reply ", request, "[", message, "]"

Сообщение об ошибке:

 socket.connect ("inproc://example2")
File "socket.pyx", line 547, in zmq.core.socket.Socket.connect (zmq\core\socket.c:5347)
zmq.core.error.ZMQError: Connection refused

Ответы [ 4 ]

13 голосов
/ 13 декабря 2011

Насколько я знаю, UDP не поддерживается 0MQ. Кроме того, IPC поддерживается только в тех ОС, которые имеют POSIX-совместимую реализацию именованных каналов; поэтому в Windows вы можете использовать только inproc, TCP или PGM. Тем не менее, помимо всего этого, одной из основных особенностей 0MQ является то, что ваш протокол является лишь частью адреса. Вы можете взять любой пример, изменить адрес сокета, и все должно работать нормально (с учетом, конечно, вышеупомянутых ограничений). Кроме того, у ZGuide есть много примеров (большое количество которых доступно в Python ).

9 голосов
/ 05 июля 2012

Если ( и только если ) вы используете сокеты ZMQ_PUB или ZMQ_SUB - чего вы не делаете в приведенных вами примерах, где вы используете ROUTER, XREQ и т. Д. - вы можете использовать UDP или точнее, UDP, многоадресная рассылка через

"epgm: // хост: порт"

EPGM означает Encapsulated PGM, т.е. PGM , инкапсулированный в UDP, что более совместимо с существующей сетевой инфраструктурой, чем необработанный PGM.

См. Также http://api.zeromq.org/2-1:zmq-pgm

Я не знаю какой-либо поддержки UDP для одноадресных сценариев.

4 голосов
/ 11 апреля 2016

ZeroMQ имеет поточно-ориентированную поддержку UDP по состоянию на март 2016 года:

  • Вы должны использовать шаблон Radio / Dish (очень похоже на Pub / Sub)
  • Поддерживается в libzmqи czmq
  • См. tests/test_udp.cpp, tests/test_radio_dish.cpp в исходном коде libzmq
  • Полная разбивка, предоставленная Дороном Сомечем в потоке zeromq-dev @ list: Потокобезопасный Pub / Sub иMulticast
0 голосов
/ 18 февраля 2016

У меня была та же проблема, когда мои версии pyzmq и zmq были более старой, я обновлял версию до 15.2.0, затем решил проблему, префикс ipc address, который я использовал, был «inproc: //»

ОС: win7-x64 питон: 2.7.6

...