ходную информацию двух процессов:
$ python redis_dryer.py &
[2] 81691
Dryer is starting
$ python redis_washer.py
Washer is starting
Washed salad
Dried salad
Washed bread
Dried bread
Washed entree
Dried entree
Washed dessert
Washer is done
Dried dessert
Dishes are dried
[2]+ Done python redis_dryer.py
Как только идентификаторы посуды начинают приходить от мойщика, наш тру-
долюбивый процесс сушильщика начинает их обрабатывать. Каждый идентификатор
посуды, за исключением финального контрольного значения, является числом из
строки quit. Когда процесс сушильщика считает этот идентификатор quit, он завер-
шает работу, после чего в терминал выводится еще немного информации о фоновом
процессе (также зависит от системы). Вы можете использовать контрольное значение
(некорректное значение), чтобы указать на что-то особенное в потоке данных — в на-
Конкуренция
315
шем случае мы говорим, что закончили работу. В противном случае нам придется
добавлять больше программной логики наподобие следующей.
Заранее оговорить некоторое максимальное количество посуды, что также будет
похоже на контрольное значение.
Выполнять некоторую специфическую коммуникацию вне потока данных
между процессами.
Завершать работу по прошествии какого-то времени, если данных не поступало.
Внесем еще несколько изменений.
Создадим несколько процессов-сушильщиков.
Заставим их завершаться по прошествии некоторого времени, если данных
не приходило.
Новый файл redis_dryer2.py:
def dryer():
import redis
import os
import time
conn = redis.Redis()
pid = os.getpid()
timeout = 20
print('Dryer process %s is starting' % pid)
while True:
msg = conn.blpop('dishes', timeout)
if not msg: