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

topic, word = sub.recv_multipart()

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'