ZeroMQ订阅服务器未通过inproc:transport类接收来自Publisher的消息

时间:2015-12-01 03:53:02

标签: zeromq publish-subscribe distributed-computing pyzmq low-latency

我是 inproc: 的新手。我正在尝试了解 Publisher 传输类,并创建了此示例示例。

Subscriber 实例正在发布消息,但 Subscriber 实例 >接收任何消息。

如果我将process个实例移到单独的 inproc: 并将tcp:更改为 import threading import time import zmq context = zmq.Context.instance() address = 'inproc://test' class Publisher(threading.Thread): def __init__(self): self.socket = context.socket(zmq.PUB) self.socket.bind(address) def run(self): while True: message = 'snapshot,current_time_%s' % str(time.time()) print 'sending message %s' % message self.socket.send(message) time.sleep(1) class Subscriber(object): def __init__(self, sub_name): self.name = sub_name self.socket = context.socket(zmq.SUB) self.socket.connect(address) def listen(self): while True: try: msg = self.socket.recv() a, b = msg.split(' ', 1) print 'Received message -> %s-%s-%s' % (self.name, a, b) except zmq.ZMQError as e: logger.exception(e) if __name__ == '__main__': thread_a = [] for i in range(0, 1): subs = Subscriber('subscriber_%s' % str(i)) th = threading.Thread(target=subs.listen) thread_a.append(th) th.start() pub = Publisher() pub_th = threading.Thread(target=pub.run) pub_th.start() 传输这个例子很有用。

以下是代码:

memcpy

1 个答案:

答案 0 :(得分:2)

没有错,但是

ZeroMQ是一个很棒的工具箱。

它充满了智能,明亮和自适应的服务,从根本上拯救了我们的贫困生活。

仍然值得阅读并遵守文档中的一些规则。

inproc 传输类有一个这样的。 .bind() 首先, .connect() -s

之前
  

[第38页,代码连接,第I卷]
<... inproc 是一种线程间信令传输...它比 tcp ipc 更快。 tpcicp相比,此传输具有特定限制:服务器必须在之前发出 bind 任何客户发出 connect 。这是未来版本的ØMQ 可以 修复,但目前这定义了您如何使用inproc套接字。

所以,举个例子:

if __name__ == '__main__':

    pub    = Publisher()
    pub_th = threading.Thread( target = pub.run )
    pub_th.start()
    # give it a place to start before .connect()-s may take place
    # give it a time  to start before .connect()-s may take place
    sleep(0.5)

    thread_a = []
    for i in range( 0, 1 ):
        subs = Subscriber( 'subscriber_%s' % str( i ) )
        th   = threading.Thread( target = subs.listen )
        thread_a.append( th )
        th.start()