Как использовать транспорты Zeromq inproc и ipc?

Я новичок в 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 ответа

Решение

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

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

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

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

Смотрите также http://api.zeromq.org/2-1:zmq-pgm

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

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

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

os: win7-x64 python: 2.7.6

Другие вопросы по тегам