Создать очередь можно с помощью списка 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) этим результатом является
некоторая информация о фоновом процессе сушильщика. Далее мы запускаем