我正在尝试使用ZeroMQ的pub-sub套接字。但是,在创建套接字(zmq::context_t
)时,我并不清楚上下文(zmq::socket_t
)的作用。
假设我想使用zmq::socket_t
创建5个用户套接字(ZMQ_SUB
),我是否需要5个上下文,每个用户套接字一个?或者我可以为所有5个套接字使用单个上下文吗?
答案 0 :(得分:6)
假设我要创建5个订阅者套接字
zmq::socket_t
using
ZMQ_SUB
),我是否需要5个上下文,每个用户一个上下文 插座?或者我可以为所有5个套接字使用单个上下文吗?
这个轻量级用例只需要一个 Context
实例。查看下面附带的文档部分,解释0MQ上下文使用情况以及我在本文末尾附上的一个示例。
ZeroMQ应用程序始终先创建一个上下文,然后再使用 用于创建套接字。在C中,它是
zmq_ctx_new()
电话。您 应该在您的流程中创建和使用一个上下文。 从技术上讲,上下文是单个中所有套接字的容器 进程,并作为inproc
套接字的传输 在一个进程中连接线程的最快方法。如果在运行时是一个进程 有两个上下文,它们就像是单独的ZeroMQ实例。
我在下面为您做了一个示例,帮助您了解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 )