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

с нашими критериями. Ключ 'channel' — это тема (порода кота), а ключ 'data' со-

держит сообщение (шляпа).

Если вы сначала запустите публикатор, которого никто не будет слушать, он

будет похож на мима, который упал в лесу (издаст ли он звук?), поэтому сначала

запустим подписчиков:

$ 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']