Подтвердить что ты не робот

Как использовать транспорты 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 socket identity")
zhelpers.dump(sink)

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

Здесь тестовый примеp > ..............

Сервер:

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, "]"

Ошибка Msg:

 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
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

os: win7-x64 python: 2.7.6