Курс языка программирования 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


💪 Или перейдите сразу к упражнениям этого раздела.