ровать остальные.
В разделе «Программы и процессы» главы 10 показано, как многопроцессорная
обработка может быть использована для того, чтобы распараллелить работу на
одной машине. Если вам нужно изменить размер изображения, ваш веб-сервер
может создать отдельный процесс, посвященный именно этой задаче, и запустить
его асинхронно. Можно масштабировать приложение горизонтально, вызвав не-
сколько процессов изменения размера.
Идея заключается в том, чтобы заставить их работать друг с другом. Наличие
любого общего элемента управления или состояния означает, что будут воз-
никать узкие места. Обрабатывать ошибки еще сложнее, поскольку конкурентные
304
Глава 11. Конкуренция и сети
вычисления труднее, чем обычные. Многое может пойти не так, и ваши шансы на
успех меньше обычных.
Какие же методы могут помочь вам справиться с этими сложностями? Начнем
с хорошего способа, который помогает справиться с несколькими задачами, — оче-
реди.
Очереди
Очередь похожа на список: элементы добавляются с одного ее конца и выходят
с другого. Часто такой принцип называют FIFO (first in, first out — «первым при-
шел — первым ушел»).
Представьте, что вы моете посуду. Если вы делаете работу целиком, вам нужно
вымыть каждую тарелку, высушить ее и отложить в сторону. Вы можете сделать
это несколькими способами. Можете вымыть первую тарелку, высушить ее и от-
ложить в сторону, а затем повторить для второй и последующих тарелок. Или же
можете сгруппировать операции и сначала помыть всю посуду, затем высушить ее
целиком, а затем отложить ее в сторону, при этом подразумевается, что в раковине
и сушилке достаточно места, чтобы разместить там всю посуду на каждом шаге.
Все эти подходы являются синхронными — один работник выполняет одно дей-
ствие в любой момент времени.
В качестве альтернативы вы могли бы найти одного-двух помощников. Если вы
мойщик, то можете вручать каждую вымытую тарелку сушильщику, который будет
вручать каждую высохшую тарелку тому, кто отложит ее в сторону. Если все рабо-
тают в одном темпе, вы должны закончить работу гораздо быстрее, чем если бы
делали ее целиком самостоятельно.
Но что, если вы моете посуду быстрее, чем сушильщик успевает с ней справ-
ляться? Либо влажная посуда падает на пол, либо вы будете складывать ее между
собой и сушильщиком, либо вы просто что-нибудь насвистываете до тех пор, пока
сушильщик не будет готов. А если последний человек медленнее сушильщика,
сухая посуда будет либо падать на пол, либо накапливаться или насвистывать
начнет уже сушильщик. У вас есть несколько работников, но общая задача все еще
синхронна и может выполняться только со скоростью самого медленного работ-
ника.
«Берись дружно, не будет грузно» — гласит старая пословица (я всегда думал,
что это пословица амишей, поскольку она заставляет меня думать о строительстве
сарая). Добавление работников может помочь построить сарай или вымыть посуду
быстрее. При этом будут задействованы очереди.
В общем случае очереди переносят сообщения, которые могут содержать любую
информацию. В нашем случае мы заинтересованы в создании очереди для распре-