держит сообщение (шляпа).
Если вы сначала запустите публикатор, которого никто не будет слушать, он
будет похож на мима, который упал в лесу (издаст ли он звук?), поэтому сначала
запустим подписчиков:
$ python redis_sub.py
Затем запустим публикатор. Он отправит десять сообщений, а затем завершит
работу:
$ python redis_pub.py
Publish: maine coon wears a stovepipe
Publish: norwegian forest wears a stovepipe
Publish: norwegian forest wears a tam-o-shanter
Publish: maine coon wears a bowler
Publish: siamese wears a stovepipe
Publish: norwegian forest wears a tam-o-shanter
Publish: maine coon wears a bowler
Publish: persian wears a bowler
Publish: norwegian forest wears a bowler
Publish: maine coon wears a stovepipe
Подписчика интересуют только две породы котов:
$ python redis_sub.py
Subscribe: maine coon wears a stovepipe
Subscribe: maine coon wears a bowler
Subscribe: maine coon wears a bowler
Subscribe: persian wears a bowler
Subscribe: maine coon wears a stovepipe
Мы не указали подписчику завершить работу, поэтому он все еще ждет сообще-
ний. Если вы перезапустите публикатор, подписчик получит еще несколько со-
общений и выведет их на экран.
320
Глава 11. Конкуренция и сети
Вы можете создать любое количество подписчиков и публикаторов. Если для
какого-то сообщения подписчика не найдется, оно пропадет с сервера Redis.
Но если подписчики есть, сообщение останется на сервере, пока все подписчики
не получат его.
ZeroMQ
Помните сокеты PUB и SUB от ZeroMQ, которые мы видели несколько страниц
назад? Они предназначены именно для этого. У ZeroMQ нет центрального сервера,
поэтому каждый публикатор пишет всем подписчикам. Перепишем наш пример
для ZeroMQ. Публикатор zmq_pub.py выглядит так:
import zmq
import random
import time
host = '*'
port = 6789
ctx = zmq.Context()
pub = ctx.socket(zmq.PUB)
pub.bind('tcp://%s:%s' % (host, port))
cats = ['siamese', 'persian', 'maine coon', 'norwegian forest']
hats = ['stovepipe', 'bowler', 'tam-o-shanter', 'fedora']