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


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