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

break

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

Помимо очередей

С увеличением числа работающих элементов повышается вероятность того, что

что-то может помешать работе нашего конвейера. Если нам нужно помыть посуду

после банкета, хватит ли нам работников? Что, если сушильщики напьются до чер-

тиков? Что, если забьется раковина? Ох уж эти проблемы!

Как же справиться с такими проблемами? К счастью, вам доступны некоторые

приемы.

 Запустить и забыть. Просто передавайте обработанные объекты дальше и не

заботьтесь о последствиях, даже если рядом никого нет. Этот подход похож на