ZeroMQ:多个套接字的相同上下文

时间:2015-08-28 21:50:14

标签: zeromq pyzmq jzmq

我正在尝试使用ZeroMQ的pub-sub套接字。但是,在创建套接字(zmq::context_t)时,我并不清楚上下文(zmq::socket_t)的作用。

假设我想使用zmq::socket_t创建5个用户套接字(ZMQ_SUB),我是否需要5个上下文,每个用户套接字一个?或者我可以为所有5个套接字使用单个上下文吗?

1 个答案:

答案 0 :(得分:6)

  

假设我要创建5个订阅者套接字zmq::socket_t   using ZMQ_SUB),我是否需要5个上下文,每个用户一个上下文   插座?或者我可以为所有5个套接字使用单个上下文吗?

这个轻量级用例只需要一个 Context 实例。查看下面附带的文档部分,解释0MQ上下文使用情况以及我在本文末尾附上的一个示例。

  

ZeroMQ应用程序始终先创建一个上下文,然后再使用   用于创建套接字。在C中,它是 zmq_ctx_new() 电话。您   应该在您的流程中创建和使用一个上下文。   从技术上讲,上下文是单个中所有套接字的容器   进程,并作为 inproc 套接字的传输   在一个进程中连接线程的最快方法。如果在运行时是一个进程   有两个上下文,它们就像是单独的ZeroMQ实例。

我在下面为您做了一个示例,帮助您了解ZMQ contextZMQ PUB-SUB模式。只要您有5个生产服务,创建5个订户套接字就可以了。但是,如果您有一个源发布通知,我建议使用PUB-SUB模式和ZMQ SUB套接字的过滤属性。您可以在我的代码中检查如何在publisher #1subscriber之间的通信中设置如下。

发布商#1发送温度和湿度更新..

import zmq
from time import sleep

# Server socket
context = zmq.Context()
socket  = context.socket( zmq.PUB )
socket.bind( "tcp://*:5556" )

while True:
    socket.send_multipart( [ "TEMP", "25.40" ] )
    socket.send_multipart( [ "HUMD", "48.90" ] )
    sleep( 1 )

发布商#2发送压力更新..

import zmq
from time import sleep

# Server socket
context = zmq.Context()
socket2 = context.socket( zmq.PUB )
socket2.bind( "tcp://*:5557" )

while True:
    socket2.send_multipart( [ "PRSS", "10000.00" ] )
    sleep( 1 )

订户注册了两个不同服务器上的温度,湿度和压力更新。

import zmq
from time import sleep

# Sockets to talk to servers
context = zmq.Context()
socket  = context.socket( zmq.SUB )
socket.connect(  "tcp://localhost:5556" )
socket2 = context.socket( zmq.SUB )
socket2.connect( "tcp://localhost:5557" )

# Set filters
socket.setsockopt_string(  zmq.SUBSCRIBE, "TEMP".decode( 'ascii' ) )
socket.setsockopt_string(  zmq.SUBSCRIBE, "HUMD".decode( 'ascii' ) )
socket2.setsockopt_string( zmq.SUBSCRIBE, "PRSS".decode( 'ascii' ) )

poller = zmq.Poller()
poller.register( socket,  zmq.POLLIN )
poller.register( socket2, zmq.POLLIN )

while True:
    socks = dict( poller.poll() )
    if socket in socks and socks[socket] == zmq.POLLIN:
        [ measurement, value ] = socket.recv_multipart()
        print measurement
        print value

    if socket2 in socks and socks[socket2] == zmq.POLLIN:
        [ measurement, value ] = socket2.recv_multipart()
        print measurement
        print value

    sleep( 1 )