我想使用ZeroMQ的pub-sub套接字。但是,在创建套接字(zmq::socket_t
)时,我不清楚上下文的作用(zmq::context_t
)。ZeroMQ:多个套接字的相同上下文
假设我想创建5个订户套接字(zmq::socket_t
使用ZMQ_SUB
),我是否需要5个上下文,每个订户套接字一个?或者我可以为所有5个套接字使用单个上下文吗?
我想使用ZeroMQ的pub-sub套接字。但是,在创建套接字(zmq::socket_t
)时,我不清楚上下文的作用(zmq::context_t
)。ZeroMQ:多个套接字的相同上下文
假设我想创建5个订户套接字(zmq::socket_t
使用ZMQ_SUB
),我是否需要5个上下文,每个订户套接字一个?或者我可以为所有5个套接字使用单个上下文吗?
假设我要创建5个用户插座(
zmq::socket_t
using
ZMQ_SUB
),我需要5个上下文,每个用户 插座?或者我可以为所有5个套接字使用单个上下文吗?
你需要为这个重量轻的用例只有一个Context
实例。请查看下面解释0MQ上下文使用情况的文档部分以及我在本文结尾附上的一个例子。
ZeroMQ应用程序总是先创建一个上下文,然后使用 创建套接字。在C中,它是调用
zmq_ctx_new()
。您应该在您的流程中创建和使用恰好一个上下文。 从技术上讲,上下文是单个进程中所有套接字的容器,并且充当传输器的插槽,这是连接一个进程中线程的最快方式。如果在运行时,进程 有两个上下文,它们就像单独的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)
感谢Krystian的正确描述和一个简单的例子! – JhnElaine