val = msg[1].decode('utf-8')
if val == 'quit':
break
print('%s: dried %s' % (pid, val))
time.sleep(0.1)
print('Dryer process %s is done' % pid)
import multiprocessing
DRYERS=3
for num in range(DRYERS):
p = multiprocessing.Process(target=dryer)
p.start()
Запустим процессы сушильщиков в фоновом режиме и процесс мойщика на
переднем плане:
$ python redis_dryer2.py &
Dryer process 44447 is starting
Dryer process 44448 is starting
Dryer process 44446 is starting
$ python redis_washer.py
316
Глава 11. Конкуренция и сети
Washer is starting
Washed salad
44447: dried salad
Washed bread
44448: dried bread
Washed entree
44446: dried entree
Washed dessert
Washer is done
44447: dried dessert
Один процесс сушильщика считывает идентификатор quit и завершает работу:
Dryer process 44448 is done
После 20 секунд другие процессы-сушильщики получают значение None от вы-
зова blpop, что указывает на то, что они завершились по таймеру. Они выводят свои
последние сообщения и завершаются:
Dryer process 44447 is done
Dryer process 44446 is done
После того как последний подпроцесс-сушильщик завершается, заканчивается
и основная программа-сушильщик:
[1]+ Done python redis_dryer2.py
Помимо очередей
С увеличением числа работающих элементов повышается вероятность того, что
что-то может помешать работе нашего конвейера. Если нам нужно помыть посуду
после банкета, хватит ли нам работников? Что, если сушильщики напьются до чер-
тиков? Что, если забьется раковина? Ох уж эти проблемы!
Как же справиться с такими проблемами? К счастью, вам доступны некоторые
приемы.
Запустить и забыть. Просто передавайте обработанные объекты дальше и не
заботьтесь о последствиях, даже если рядом никого нет. Этот подход похож на