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

процесс мойщика как обычно (на переднем плане). Вы увидите смешанную вы-

ходную информацию двух процессов:

$ 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: