我正在尝试使用ZeroMQ的pub-sub套接字。但是,我不清楚在创建套接字(zmq::context_t
)时上下文(zmq::socket_t
)的作用。
假设我要创建5个订阅者套接字(使用zmq::socket_t
的ZMQ_SUB
),我是否需要5个上下文,每个订阅者套接字一个?还是可以对所有5个套接字使用单个上下文?
最佳答案
对于此轻量级用例,您仅需要一个 Context
实例。检查下面所附文档中解释0MQ上下文用法的部分,以及我在本文末尾为您制作的示例。
我在下面为您提供了一个示例,以帮助您了解ZMQ context
和ZMQ PUB-SUB
模式。只要您有5个生产服务,就可以创建5个用户套接字。但是,如果您有一个源发布通知,我建议您使用PUB-SUB
模式和ZMQ SUB
套接字的过滤属性。您可以在下面的代码中检查如何设置publisher #1
和subscriber
之间的通信。
发布者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 )