ZeroMQ: одинаковый контекст для нескольких сокетов
Я пытаюсь использовать паб-сокеты ZeroMQ. Тем не менее, я не совсем понимаю роль контекста (zmq::context_t
) при создании сокетов (zmq::socket_t
).
Предполагая, что я хочу создать 5 абонентских сокетов (zmq::socket_t
с помощью ZMQ_SUB
), мне нужно 5 контекстов, по одному для каждого из сокетов абонента? Или я могу использовать один контекст для всех 5 сокетов?
1 ответ
Предполагая, что я хочу создать 5 абонентских сокетов (
zmq::socket_t
using
ZMQ_SUB
), мне нужно 5 контекстов, по одному для каждого из сокетов абонента? Или я могу использовать один контекст для всех 5 сокетов?
Вам нужен только один Context
экземпляр для этого легкого варианта использования. Ознакомьтесь с частью документации, прилагаемой ниже, объясняющей использование контекста 0MQ, и примером, который я сделал для вас, который приведен в конце этого поста.
Приложения ZeroMQ всегда начинаются с создания контекста, а затем используют его для создания сокетов. В С это
zmq_ctx_new()
вызов. Вы должны создать и использовать ровно один контекст в вашем процессе. Технически, контекст является контейнером для всех сокетов в одном процессе и действует как транспорт дляinproc
сокеты, которые являются самым быстрым способом соединения потоков в одном процессе. Если во время выполнения процесс имеет два контекста, они похожи на отдельные экземпляры 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 )