我想使用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