Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Конкурентне програмування / hyper і race 🆕
Невпорядкований паралелізм з race
.race розпаралелює так само, як .hyper, з
однією різницею: він не обіцяє повернути результати в
порядку. Хто з робітників завершить першим, той першим і віддасть свій
результат.
say (1..10).race.map(* ** 2).sort; # (1 4 9 16 25 36 49 64 81 100)Квадрати повертаються в непередбачуваному порядку, тож
.sort стоїть тут, щоб зробити вивід детермінованим. Якби ми
надрукували без сортування, числа були б усі, але, можливо,
перемішані.
Оскільки йому не доводиться тримати результати впорядкованими,
.race може мати трохи менше накладних витрат, ніж
.hyper. Компроміс простий:
- використовуйте
.hyper, коли порядок результатів має значення; - використовуйте
.race, коли не має, — наприклад, коли ви збираєтеся підсумувати, порахувати або інакше поєднати результати способом, незалежним від порядку.
say (1..100).race.map(* * 2).sum; # 10100Підсумовування незалежне від порядку, тож .race тут
цілком доречний і дає те саме 10100. Обидва методи
стосуються однієї ідеї — дати незалежній роботі виконуватися водночас, —
і обираєте ви між ними за тим, чи важливий вам порядок.
Навігація курсом
← Тест — hyper | Налаштування з :batch і :degree →
💪 Або перейдіть одразу до вправ цього
розділу.