Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 249

time.sleep(1)

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