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

пьютере, вы можете сделать их независимыми. Медленные задачи не будут блоки-

ровать остальные.

В разделе «Программы и процессы» главы 10 показано, как многопроцессорная

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

одной машине. Если вам нужно изменить размер изображения, ваш веб-сервер

может создать отдельный процесс, посвященный именно этой задаче, и запустить

его асинхронно. Можно масштабировать приложение горизонтально, вызвав не-

сколько процессов изменения размера.

Идея заключается в том, чтобы заставить их работать друг с другом. Наличие

любого общего элемента управления или состояния означает, что будут воз-

никать узкие места. Обрабатывать ошибки еще сложнее, поскольку конкурентные

304

Глава 11. Конкуренция и сети

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

успех меньше обычных.

Какие же методы могут помочь вам справиться с этими сложностями? Начнем

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

реди.

Очереди

Очередь похожа на список: элементы добавляются с одного ее конца и выходят

с другого. Часто такой принцип называют FIFO (first in, first out — «первым при-

шел — первым ушел»).

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

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

это несколькими способами. Можете вымыть первую тарелку, высушить ее и от-

ложить в сторону, а затем повторить для второй и последующих тарелок. Или же

можете сгруппировать операции и сначала помыть всю посуду, затем высушить ее

целиком, а затем отложить ее в сторону, при этом подразумевается, что в раковине

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

Все эти подходы являются синхронными — один работник выполняет одно дей-

ствие в любой момент времени.

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

мойщик, то можете вручать каждую вымытую тарелку сушильщику, который будет

вручать каждую высохшую тарелку тому, кто отложит ее в сторону. Если все рабо-

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

делали ее целиком самостоятельно.

Но что, если вы моете посуду быстрее, чем сушильщик успевает с ней справ-

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

собой и сушильщиком, либо вы просто что-нибудь насвистываете до тех пор, пока

сушильщик не будет готов. А если последний человек медленнее сушильщика,

сухая посуда будет либо падать на пол, либо накапливаться или насвистывать

начнет уже сушильщик. У вас есть несколько работников, но общая задача все еще

синхронна и может выполняться только со скоростью самого медленного работ-

ника.

«Берись дружно, не будет грузно» — гласит старая пословица (я всегда думал,

что это пословица амишей, поскольку она заставляет меня думать о строительстве

сарая). Добавление работников может помочь построить сарай или вымыть посуду

быстрее. При этом будут задействованы очереди.

В общем случае очереди переносят сообщения, которые могут содержать любую

информацию. В нашем случае мы заинтересованы в создании очереди для распре-