2015-08-28 71 views
1

我想使用ZeroMQ的pub-sub套接字。但是,在創建套接字(zmq::socket_t)時,我不清楚上下文的作用(zmq::context_t)。ZeroMQ:多個套接字的相同上下文

假設我想創建5個訂戶套接字(zmq::socket_t使用ZMQ_SUB),我是否需要5個上下文,每個訂戶套接字一個?或者我可以爲所有5個套接字使用單個上下文嗎?

回答

4

假設我要創建5個用戶插座(zmq::socket_t usingZMQ_SUB),我需要5個上下文,每個用戶 插座?或者我可以爲所有5個套接字使用單個上下文嗎?

你需要爲這個重量輕的用例只有一個Context實例。請查看下面解釋0MQ上下文使用情況的文檔部分以及我在本文結尾附上的一個例子。

ZeroMQ應用程序總是先創建一個上下文,然後使用 創建套接字。在C中,它是調用zmq_ctx_new()。您應該在您的流程中創建和使用恰好一個上下文。 從技術上講,上下文是單個進程中所有套接字的容器,並且充當傳輸器的插槽,這是連接一個進程中線程的最快方式。如果在運行時,進程 有兩個上下文,它們就像單獨的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) 
+0

感謝Krystian的正確描述和一個簡單的例子! – JhnElaine

相關問題