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

грань, которая работает с конкуренцией.

Создать очередь можно с помощью списка Redis. Сервер Redis работает на одной

машине, на которой могут быть запущены и клиенты. Возможно также, что никакие

клиенты на ней не запускаются, а остальные машины получают доступ к серверу

по сети. В любом случае клиент общается с сервером с помощью протокола TCP.

Один или несколько клиентов-провайдеров помещают сообщения в конец списка.

Один или несколько клиентов-работников наблюдают за списком и используют

операцию «блокирующее выталкивание». Если список пуст, то все они просто про-

водят время впустую. Как только появляется сообщение, его получает первый

желающий работник.

Как и в предыдущем примере, основанном на процессах и потоках, код файла

redis_washer.py генерирует последовательность посуды:

import redis

conn = redis.Redis()

print('Washer is starting')

dishes = ['salad', 'bread', 'entree', 'dessert']

for dish in dishes:

msg = dish.encode('utf-8')

conn.rpush('dishes', msg)

print('Washed', num)

conn.rpush('dishes', 'quit')

print('Washer is done')

Цикл генерирует четыре сообщения, содержащие названия тарелок, за которы-

ми следуют финальные сообщения, которые содержат слово quit. Каждое сообще-

ние добавляется в список тарелок на сервере Redis по принципу, сходному с прин-

ципами Python.

Как только первая тарелка готова, в работу вступает код файла redis_dryer.py:

import redis

conn = redis.Redis()

print('Dryer is starting')

314

Глава 11. Конкуренция и сети

while True:

msg = conn.blpop('dishes')

if not msg:

break

val = msg[1].decode('utf-8')

if val == 'quit':

break

print('Dried', val)

print('Dishes are dried')

Этот код ожидает прихода сообщений, чьим первым токеном является слово

dishes, и выводит сообщение каждой высушенной тарелки. Он подчиняется сообще-

нию quit, завершая цикл.

Запустите сначала сушильщика, а затем мойщика. С помощью символа & в кон-

це команды мы запускаем первую программу в фоновом режиме, она продолжает

работать, но больше не принимает команды с клавиатуры. Это работает для опера-

ционных систем Linux, OS X и Windows, однако вы можете получить разные ре-

зультаты в следующей строке. В нашем случае (OS X) этим результатом является

некоторая информация о фоновом процессе сушильщика. Далее мы запускаем