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

假设我要创建5个订阅者套接字(使用zmq::socket_tZMQ_SUB),我是否需要5个上下文,每个订阅者套接字一个?还是可以对所有5个套接字使用单个上下文?

最佳答案



对于此轻量级用例,您仅需要一个 Context 实例。检查下面所附文档中解释0MQ上下文用法的部分,以及我在本文末尾为您制作的示例。



我在下面为您提供了一个示例,以帮助您了解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 )

09-04 19:36
查看更多