Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Конкурентное программирование / hyper и race 🆕
Параллельный map с hyper
Вызовите .hyper у списка перед map или
grep — и работа распределится между несколькими рабочими
потоками, а результаты всё равно вернутся в исходном
порядке:
say (1..5).hyper.map(* * 2); # (2 4 6 8 10)Выглядит это в точности как обычный map, и результат тот
же самый; разница лишь в том, что удвоения могли быть вычислены
одновременно на разных ядрах.
С grep метод .hyper работает точно так же:
каждый элемент проверяется параллельно, а прошедшие проверку всё равно
возвращаются в исходном порядке:
say (1..10).hyper.grep(* %% 2); # (2 4 6 8 10)Поскольку .hyper сохраняет порядок, он служит прямой
заменой медленному map или grep: ничего из
того, что зависит от порядка результатов, менять не придётся. Выигрыш
появляется только тогда, когда работа над каждым элементом достаточно
велика, чтобы перевесить издержки на координацию потоков, — возведение
числа в квадрат в реальности слишком дёшево, чтобы его имело смысл
распараллеливать. Но для по-настоящему дорогой поэлементной работы над
большим списком .hyper способен превратить долгое ожидание
в короткое ценой одного вызова метода.
Одно стоит помнить: действительно ли работа распределится по
ядрам, решает компилятор. Язык фиксирует результаты — а для
.hyper ещё и их исходный порядок, — но не требует
настоящего параллельного выполнения. .hyper и
.race запрашивают параллельность, а не
предписывают её, поэтому конкретный компилятор может выполнить их на
пуле потоков, а может тихо обработать элементы последовательно. Считайте
их возможностью ускорения, а не гарантией.
Поскольку порядок сохраняется, операции, которые от него зависят, по-прежнему дают верный результат. Здесь каждое слово переводится в верхний регистр параллельно, но части складываются обратно во фразу в исходной последовательности:
say <raku is fun>.hyper.map(*.uc).join(' '); # RAKU IS FUNПрактика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← hyper и race 🆕 | Тест — hyper →
💪 Или перейдите сразу к упражнениям этого
раздела.