Запрос — ответ. Мойщик получает подтверждение от сушильщика, а сушиль-
щик — от того, кто откладывает посуду в сторону. Все это выполняется для
каждой тарелки.
Регулирование нагрузки. Этот прием указывает самому быстрому работнику
притормозить, если один из работников, стоящих после него, не поспевает
за ним.
В реальных системах вам нужно внимательно следить за тем, чтобы все работ-
ники успевали за предложением, в противном случае вы услышите звук бьющейся
Сети
317
посуды. Вы можете добавить новые задачи в список ожидания, а какой-нибудь
процесс будет доставать из этого списка последнее сообщение и помещать в список
обработки. Когда сообщение будет обработано, оно будет удалено из списка об-
работки и добавлено в список завершенных задач. Это позволит вам узнать, какие
задачи были провалены или занимают слишком много времени. Вы можете сделать
это самостоятельно с помощью Redis или использовать систему, которую кто-то
написал и протестировал до вас. Некоторые основанные на Python пакеты для
работы с очередями (часть из них используют Redis) позволяют удобно управлять
процессом.
Celery. На этот пакет стоит обратить внимание. Он может выполнять распреде-
ленные задачи как синхронно, так и асинхронно, используя рассмотренные нами
методы: multiprocessing, gevent и др.
thoonk. Этот пакет создан на базе Redis, он позволяет использовать очереди
задач и механизм публикации-подписки (этот механизм будет рассмотрен
в следующем разделе).
rq. Это библиотека Python для очередей задач, она также основана на Redis.
Queues. Этот сайт предлагает поучаствовать в дискуссии о программном обес-
печении для создания очередей, как написанном на Python, так и ином.
Сети
Когда мы говорили о конкуренции, то рассматривали только вопросы, связанные
с временем, — решения для одной машины (процессы, потоки, зеленые потоки).
Мы также кратко коснулись некоторых решений, которые могут охватывать всю
сеть (Redis, ZeroMQ). Теперь же рассмотрим работу с сетями и распределение вы-
числений в пространстве.
Шаблоны
Сетевые приложения можно создать на основе некоторых простых шаблонов.
Самым распространенным шаблоном является «запрос — ответ», также извест-
ный как клиент-сервер. Этот шаблон работает синхронно: клиент ожидает ответа
сервера. Вы видели множество примеров использования такого шаблона в этой
книге. Ваш браузер — это также клиент, делающий HTTP-запрос к веб-серверу,
который возвращает ответ.
Еще одним распространенным шаблоном является «разветвление на выходе»:
вы отправляете данные любому доступному работнику из пула процессов. При-
мером является веб-сервер, расположенный за балансировщиком нагрузки.
Противоположностью этого шаблона является шаблон «разветвление на вхо-
де»: вы принимаете данные из одного или более источников. Примером является
318
Глава 11. Конкуренция и сети
регистратор, который принимает текстовые сообщения от нескольких процессов