如何使用Zeromq的inproc和ipc传输?

时间:2011-12-13 16:13:01

标签: python ipc zeromq inproc

我是ZERMQ的新手。 ZeroMQ具有TCP,INPROC和IPC传输。我正在寻找在Winx64和python 2.7中使用python和inproc的例子,它们也可以用于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就像分发信息一样。使用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 个答案:

答案 0 :(得分:13)

据我所知,0MQ不支持UDP。此外,IPC仅支持具有符合POSIX的命名管道实现的操作系统;因此,在Windows上,您实际上只能使用'inproc',TCP或PGM。但是,除此之外,0MQ的主要功能之一是您的协议只是地址的一部分。您可以采取任何示例,更改套接字地址,一切都应该仍然可以正常工作(当然,主题是上述限制)。此外,ZGuide有很多例子(Python中提供了很多例子)。

答案 1 :(得分:9)

如果(and only if)你使用的是ZMQ_PUB或ZMQ_SUB套接字 - 你在你给出的例子中没有使用ROUTER,XREQ等 - 你可以使用UDP,或者更确切地说,< strong> UDP多播通过

  

“epgm://主机:端口”

EPGM代表Encapsulated PGM,即PGM封装在UDP中,与原始PGM相比,它与现有网络基础设施更兼容。

另见http://api.zeromq.org/2-1:zmq-pgm

我不知道对单播方案有任何UDP支持。

答案 2 :(得分:4)

自2016年3月起,ZeroMQ拥有线程安全的UDP支持:

  • 你必须使用Radio / Dish模式(非常类似于Pub / Sub)
  • 在libzmq和czmq
  • 中受支持
  • 请参阅libzmq源代码中的tests/test_udp.cpptests/test_radio_dish.cpp
  • Doron Somech在zeromq-dev @ list帖子中提供完整细分:Thread safe Pub/Sub and Multicast

答案 3 :(得分:0)

当我的pyzmq和zmq的版本是旧版本时我遇到了同样的问题,我将版本升级到15.2.0,然后解决了问题,我使用的ipc地址前缀是“inproc://”

os:win7-x64 python:2.7.6