print(topic, word)
Если вы запустите эти программы, они не будут работать, хотя код выглядит
хорошо. Вам нужно прочитать руководство ZeroMQ, чтобы узнать о проблеме
медленного присоединившегося: даже если вы запустите клиент раньше сервера,
сервер начнет отправлять данные сразу после запуска, а клиенту потребуется
некоторое время, чтобы подключиться к серверу. Если вы публикуете сообщения
постоянным потоком и не задумываетесь о том, когда к вам подключаются под-
писчики, это не проблема. Но в этом случае поток данных настолько короткий,
что он заканчивается еще до того, как подписчик успеет моргнуть.
Простейший способ исправить это — заставить публикатора пропустить секун-
ду после вызова метода bind() и до того, как он начнет отправлять сообщения.
Назовем эту версию poem_pub_sleep.py:
import string
import zmq
from time import sleep
host = '127.0.0.1'
port = 6789
ctx = zmq.Context()
pub = ctx.socket(zmq.PUB)
pub.bind('tcp://%s:%s' % (host, port))
sleep(1)
with open('mammoth.txt', 'rt') as poem:
words = poem.read()
for word in words.split():
word = word.strip(string.punctuation)
data = word.encode('utf-8')
if word.startswith(('a','e','i','o','u','A','e','i','o','u')):
print('vowels', data)
pub.send_multipart([b'vowels', data])
if len(word) == 5:
print('five', data)
pub.send_multipart([b'five', data])
Запустите подписчика, а затем и сонного публикатора:
$ python poem_sub.py
$ python poem_pub_sleep.py
Теперь у подписчика есть время на то, чтобы получить сообщения по выбранным
темам. Так выглядят первые строки выходной информации:
b'five' b'queen'
b'vowels' b'of'
472
Приложение Д. Ответы к упражнениям
b'five' b'Lying'
b'vowels' b'at'
b'vowels' b'ease'
b'vowels' b'evening'
b'five' b'flies'
b'five' b'seize'
b'vowels' b'All'
b'five' b'gaily'