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


💪 Или преминете направо към упражненията в този раздел.