【问题标题】:ZeroMQ: Same context for multiple socketsZeroMQ:多个套接字的相同上下文
【发布时间】:2015-08-28 21:50:13
【问题描述】:

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

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

【问题讨论】:

    标签: zeromq pyzmq jzmq


    【解决方案1】:

    假设我想创建 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 #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 )
    

    【讨论】:

    • 感谢 Krystian 的正确描述和一个简单的例子!
    • 很抱歉恢复这么旧的帖子,但需要setsockopt_string 吗?我尝试使用已注册的pub 套接字仅复制sub 部分,但失败了,我不知道为什么。我唯一省略的部分是setsockopt_string
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多