Курс 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


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