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

Jhn*_*ine 4 zeromq jzmq pyzmq

我正在尝试使用ZeroMQ的pub-sub套接字.但是,我zmq::context_t在创建套接字(zmq::socket_t)时并没有清楚地理解context()的作用.

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

Kry*_*ski 7

假设我想创建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 #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 )
Run Code Online (Sandbox Code Playgroud)

发布者#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 )
Run Code Online (Sandbox Code Playgroud)

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

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 )
Run Code Online (Sandbox Code Playgroud)