Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Конкурентне програмування / hyper і race 🆕
Налаштування з :batch і :degree
І .hyper, і .race приймають два
прислівники, що керують тим, як роботу розділено між потоками:
:degree та :batch. Вони рідко потрібні, але
саме до них ви звертаєтеся, коли налаштовуєте швидкість.
:degree — скільки
робітників
:degree задає, скільки робочих потоків працюють
одночасно:
say (1..5).hyper(:degree(2)).map(*²); # (1 4 9 16 25)Типово degree близький до кількості ядер процесора машини — на
восьмиядерній машині це 7, лишаючи одне ядро головній
програмі. Піднімати його значно вище за кількість ядер рідко допомагає,
бо більше ядер для роботи немає, а зайва координація може навіть
уповільнити справу.
:batch — скільки
елементів за раз
:batch задає, скільки елементів кожен робітник бере за
один захід, перш ніж повернутися по нові:
say (1..6).hyper(:batch(2)).map(*²); # (1 4 9 16 25 36)Типовий batch дорівнює 64, і розмір є компромісом:
- Великий batch означає менше метушні між робітниками та планувальником — менше накладних витрат, що добре, коли кожен елемент коштує приблизно однаково.
- Малий batch рівномірніше розподіляє роботу, коли деякі елементи набагато дорожчі за інші, тож жоден робітник не застрягає з усіма повільними — ціною більшої координації.
Обидва можна задати водночас, і на .race так само, як на
.hyper:
say (1..6).race(:degree(2), :batch(3)).map(*²).sum; # 91Якщо вам цікаво, які ж типові значення насправді, ви можете зазирнути в них через нутрощі Rakudo. Зауважте, що це читає приватний атрибут — це не стабільний API, і числа залежать від вашої машини:
my $h := (1..10).hyper;
say $h.^attributes.first(*.name.contains('config')).get_value($h).raku;
# HyperConfiguration.new(batch => 64, degree => 7)Тут batch дорівнює фіксованому типовому 64,
а degree — 7, тобто на одиницю менше за вісім
ядер цієї машини.
Це все ще лише підказки
Як і самі .hyper та .race, ці прислівники
просять певного поділу, а не гарантують його.
Компілятор вільний зважити на них, скоригувати їх або цілком
проігнорувати — тож ставтеся до :batch та
:degree як до ручок, які варто покрутити під час
налаштування, а не як до обіцянок про те, як саме виконуватиметься
робота.
Практика
Виконайте 1 тест за змістом цієї теми.
Навігація курсом
← Невпорядкований паралелізм з race | Тест — batch і degree →
💪 Або перейдіть одразу до вправ цього
розділу.