for msg in range(10):
cat = random.choice(cats)
cat_bytes = cat.encode('utf-8')
hat = random.choice(hats)
hat_bytes = hat.encode('utf-8')
print('Publish: %s wears a %s' % (cat, hat))
pub.send_multipart([cat_bytes, hat_bytes])
Обратите внимание на то, как в этом коде используется кодировка UTF-8 для
темы и строки значения.
Файл подписчика называется zmq_sub.py:
import zmq
host = '127.0.0.1'
port = 6789
ctx = zmq.Context()
sub = ctx.socket(zmq.SUB)
sub.connect('tcp://%s:%s' % (host, port))
topics = ['maine coon', 'persian']
for topic in topics:
sub.setsockopt(zmq.SUBSCRIBE, topic.encode('utf-8'))
while True:
cat_bytes, hat_bytes = sub.recv_multipart()
cat = cat_bytes.decode('utf-8')
hat = hat_bytes.decode('utf-8')
print('Subscribe: %s wears a %s' % (cat, hat))
Сети
321
В этом коде мы подписываемся на два разных байтовых значения: две строки
из topics, закодированные с помощью UTF-8.
Это может показаться немного запутанным, но если вы хотите подписываться на все темы,
то нужно подписаться на пустую строку байтов ' '. Если вы этого не сделаете, то не полу-
чите ничего.
Обратите внимание на то, что в публикаторе мы вызываем метод send_multipart(),
а в подписчике — recv_multipart(). Это позволяет нам отправлять многокомпонент-
ные сообщения и использовать первую часть как тему. Мы также можем отправить
тему и сообщение как простую строку или строку байтов, но подход, где коты
и шляпы разделены, кажется более чистым.
Запустите подписчик:
$ python zmq_sub.py
Запустите публикатор. Он немедленно отправит десять сообщений, а затем за-
вершит работу:
$ python zmq_pub.py
Publish: norwegian forest wears a stovepipe
Publish: siamese wears a bowler
Publish: persian wears a stovepipe
Publish: norwegian forest wears a fedora
Publish: maine coon wears a tam-o-shanter
Publish: maine coon wears a stovepipe
Publish: persian wears a stovepipe
Publish: norwegian forest wears a fedora