ZeroMQ: одинаковый контекст для нескольких сокетов

Я пытаюсь использовать паб-сокеты ZeroMQ. Тем не менее, я не совсем понимаю роль контекста (zmq::context_t) при создании сокетов (zmq::socket_t).

Предполагая, что я хочу создать 5 абонентских сокетов (zmq::socket_t с помощью ZMQ_SUB), мне нужно 5 контекстов, по одному для каждого из сокетов абонента? Или я могу использовать один контекст для всех 5 сокетов?

1 ответ

Решение

Предполагая, что я хочу создать 5 абонентских сокетов (zmq::socket_tusingZMQ_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 )
Другие вопросы по тегам