【问题标题】:How to use Zeromq's inproc and ipc transports?如何使用 Zeromq 的 inproc 和 ipc 传输?
【发布时间】:2012-01-19 12:18:51
【问题描述】:

我是 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 测试 Push/Pull 更快,或者 inproc 更快。

这里是测试示例>.......

服务器:

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

【问题讨论】:

标签: python ipc zeromq inproc


【解决方案1】:

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

【讨论】:

  • @Merlin:这些是在单独的过程中吗?因为“inproc”只适合作为线程场景的替代品。
  • 这是它的基本形式:http://zguide.zeromq.org/py:mtserver。此处提供更多详细信息:http://zguide.zeromq.org/page:all#Multithreading-with-MQ
  • zguide.zeromq.org/py:mtserver 对我来说可能没有任何意义。看着这个。它只是更令人困惑。示例的客户端在哪里???或者工人方面的例子在哪里????
  • 对不起,我应该更清楚一点。 mtserver 示例是从hello world 示例重新设计的服务器版本。它使用相同的客户端:http://zguide.zeromq.org/py:hwclient。实际上,服务器进程创建了几个工作进程(每个都在一个新线程上)。它还创建一个用于处理客户端请求的套接字和一个用于向工作人员(即线程)发送消息的套接字。最后,zmq.device(zmq.QUEUE, clients, workers) 行在两个套接字之间传输消息。
  • @raffian:我相信你误读了评论。 inproc 将适用于所有平台。在 Windows 上,您根本无法使用 IPC
【解决方案2】:

如果 (and only if) 你使用 ZMQ_PUB 或 ZMQ_SUB 套接字——在你给出的示例中没有这样做,你使用 ROUTER、XREQ 等——你可以使用 UDP,或者更准确地说, UDP 多播 通过

"epgm://host:port"

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

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

我不知道任何 UDP 支持单播场景。

【讨论】:

    【解决方案3】:

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

    操作系统:win7-x64 蟒蛇:2.7.6

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 邮件列表的链接坏了,改用here
      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 2018-07-13
      • 2015-12-17
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多