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

можем делать больше одного дела одновременно (конкуренция) и в нескольких

местах сразу (распределенные вычисления, или работа с сетями). Существует не-

сколько хороших причин бросить вызов пространству и времени.

 Производительность. Ваша цель заключается в том, чтобы более быстрые ком-

поненты были постоянно заняты, а не ждали более медленных.

 Прочность. Один в поле не воин, поэтому вы хотите продублировать задачи,

чтобы обойти недостатки аппаратной и программной частей.

 Простота. Хорошим тоном является разбиение сложных задач на много простых,

которые проще создать, понять и исправить.

 Коммуникация. Отправлять независимые байты куда-нибудь далеко, чтобы они

пришли с друзьями, очень весело.

Мы начнем с рассмотрения конкуренции, основываясь поначалу на несетевых

приемах, описанных в главе 10, — процессах и потоках. Далее рассмотрим осталь-

ные подходы вроде функций обратного вызова, зеленых потоков и сопрограмм.

Наконец, поговорим о работе с сетями, изначально в рамках вопроса о конкуренции,

а затем и целиком.

Некоторые пакеты Python, рассмотренные в этой главе, еще не были портированы в Python 3

на момент написания книги. В большинстве случаев я буду показывать вам код, который

нужно запускать с помощью интерактивного интерпретатора Python 2, который мы называ-

ем python2.

Конкуренция

303

Конкуренция

Официальный сайт Python рассматривает тему конкуренции в общих чертах и с точ-

ки зрения стандартной библиотеки (http://bit.ly/concur-lib). Эти страницы содержат

множество ссылок на различные пакеты и приемы, мы покажем наиболее полезные

из них в этой главе.

Когда речь идет о компьютерах, вам приходится ждать чего-то по одной из двух

причин:

 ограничения ввода-вывода. Эта причина распространена шире других. Про-

цессоры компьютеров безумно быстры — в сотни раз быстрее, чем компьютерная

память, и в тысячи — чем диски или сети.

 ограничения процессора. Это случается, если выполняется большое количество

объемных задач наподобие научных или графических расчетов.

С конкуренцией связаны еще два термина:

 синхронность — одна вещь следует за другой, как на похоронной процессии;

 асинхронность — задачи независимы, как кошки, которые гуляют сами по себе.

По мере продвижения от простых систем и задач к проблемам реальной жизни

в какой-то момент вам придется решить проблему конкуренции. Например, рас-

смотрим сайт. Вы, как правило, можете предоставить статическую и динамическую

страницы довольно быстро. Если ожидание длится долю секунды, приложение

считается интерактивным, но если время до отображения или взаимодействия

более продолжительное, люди становятся нетерпеливыми. Тесты, проведенные

компаниями Google и Amazon, показали, что трафик быстро падает, если страница

загружается хоть немного медленнее обычного.

Но что, если вы не можете повлиять на то, что долго выполняется, например

загрузка файла на сервер, изменение размеров изображения или запрос к базе

данных? Вы больше не можете делать это с помощью синхронного кода, поскольку

кто-то уже ждет.

Если вы хотите выполнить несколько задач как можно быстрее на одном ком-