Профессор: Итак, у тебя сейчас болит голова?
Студент: (принимает две таблетки средства от головной боли) Ну, немного. Трудно думать обо всех способах чередования потоков
Профессор: Действительно, это так. Меня всегда поражает, что при одновременном выполнении, всего несколько строк кода могут стать практически невозможными для понимания
Студент: Я тоже! Мне, специалисту по информатике, немного неловко не иметь возможности разобраться в пяти строках кода
Профессор: О, не расстраивайся так сильно. Если вы просмотрите первые статьи по параллельным алгоритмам, то увидите, что они иногда ошибочны! И авторы часто профессора!
Студент: (вздыхает) Профессора могут ... ммм... ошибаться?
Профессор: Да, это так. Только никому не говорите — это один из наших коммерческих секретов
Студент: Я поклялся хранить тайну. Но если о параллельном коде так трудно думать и его так трудно исправить, как мы должны писать правильный параллельный код?
Профессор: Что ж, это и есть настоящий вопрос, не так ли? Я думаю, все начинается с нескольких простых вещей. Во-первых, делайте это просто! Избегайте сложных взаимодействий между потоками и используйте хорошо известные и проверенные способы управления взаимодействиями потоков.
Студент: Например, простая блокировка и, возможно, очередь producer-consumer?
Профессор: Точно! Это общие парадигмы, и вы должны быть в состоянии создавать рабочие решения, учитывая то, что вы узнали. Во-вторых, используйте параллелизм только тогда, когда это абсолютно необходимо; избегайте его, если это вообще возможно. Нет ничего хуже, чем преждевременная оптимизация программы
Студент: Я понимаю — зачем добавлять потоки, если они вам не нужны?
Профессор: Точно. В-третьих, если вам действительно нужен параллелизм, ищите его в других упрощенных формах. Например, метод MapReduce для написания кода параллельного анализа данных является отличным примером достижения параллелизма без необходимости обрабатывать какие-либо ужасающие сложности блокировок, переменных условий и других неприятных вещей, о которых мы говорили
Стедент: MapReduce, да? Звучит интересно — мне придется прочитать об этом подробнее самостоятельно.
Профессор: Хорошо! Вы должны. В конце концов, вам придется многое из этого сделать, поскольку то, чему мы учимся вместе, может служить лишь самым поверхностным введением в то богатство знаний, которое существует в мире. Читайте, читайте и еще раз читайте! А затем попробуйте что-нибудь, напишите какой-нибудь код, а затем напишите еще что-нибудь. И больше практикуйтесь; помимо того, что описано в этой книге, существует множество других ресурсов. Как говорит Гладуэлл в своей книге “Outliers”, вам нужно потратить на что-то примерно 10 000 часов, чтобы стать настоящим экспертом. Ты не можешь делать это только во время занятий!
Студент: Вау, я не уверен, угнетает это или поднимает настроение. Но я предположу последнее и приступлю к работе! Пришло время написать еще немного параллельного кода...
PS Для статьи сгенерировал изображение с помощью rudalle.ru промпт - название главы