Как мне отправить dict с шаблоном PUB / SUB, используя pyzmq? - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь отправить словарь Python, используя что-то вроде:

import zmq
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port
socket.send_pyobj({'hello':'world'})

и получить его, используя:

socket.connect ("tcp://localhost:%s" % port)
topicfilter = "1"

socket.setsockopt_string(zmq.SUBSCRIBE, topicfilter)

while True:
    print(socket.recv_pyobj())

Вопросы :

  1. Кажется, я не могу понять, как задать тему для send_pyobj().
  2. Само собой разумеется, я не получаю ничего на другом конце.Мне удалось запустить его со строками и send_string(), так что он определенно соединяется.Что я делаю не так?
  3. Могу ли я иметь несколько PUB серверов вещания?Тем самым создавая что-то типа «многие ко многим», где другие приложения могут погрузиться в поток?

1 Ответ

0 голосов
/ 26 апреля 2018
Могу ли я иметь несколько PUB серверов, вещающих?

Да, вы можете

Легко.


Я не получаю ничего на другом конце ... Что я делаю не так?

Не подписывайтесь на "1" в случаях,когда он никогда не наступит

Эта единственная причина стоит за "не получением чего-либо" (если только оно не началось с "1", чего, очевидно, никогда не было, поскольку полезная нагрузка была собрана прямо socket.send_object( ... ) и никогда не было "1" для сопоставления с позицией байта, похожего на строку [0].


  1. ... как установить тему для send_pyobj()?

Ну, вы никогда не знаете,

Это должно быть установлено с помощью другихозначает, чем угадывать несколько байтов, «сопоставляя» начальную секцию представления объекта-байта-строки.

Самое простое - «предварительно» добавить контролируемое значение на стороне отправителя следующим образом:

import dill as pickle

aConstantNbytesPUB_TOPIC_FILTER_PREFIX = "{UUID:0000-0000-0000-1111-2222}"

socket.send( aConstantNbytesPUB_TOPIC_FILTER_PREFIX
           + pickle.dumps( anObjectToSEND )
             )
...

aMSG = socket.recv()
print( pickle.loads( aMSG[ len( aConstantNbytesPUB_TOPIC_FILTER_PREFIX ):]
                     )
       )

Использование композиции из нескольких частей также возможно, но немного дольше, чтобы продемонстрировать концепцию здесь.

Оба pickleи dill ограничены в своих стратегиях SER / DES для возможностей декомпозиции / обхода / восстановления объектов, а предупреждения о безопасности, как известно, принимаются во внимание.

...