Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Конкурентне програмування / hyper і race 🆕

Паралельний map з hyper

Викличте .hyper на списку перед map або grep — і роботу буде розподілено між кількома робочими потоками, тоді як результати все одно повернуться в початковому порядку:

say (1..5).hyper.map(* * 2); # (2 4 6 8 10)

Це має вигляд звичайного map, і результат ідентичний; єдина різниця в тому, що подвоєння могли обчислюватися на різних ядрах водночас.

.hyper так само працює з grep — кожен елемент перевіряється паралельно, а ті, що пройшли, все одно повертаються в початковому порядку:

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


💪 Або перейдіть одразу до вправ цього розділу.