Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Реактивное программирование / react и whenever / Exercises / Два whenever
Решение: Два whenever
Вот один из возможных вариантов решения задачи.
Код
my $deposits = Supply.from-list(100, 50, 200);
my $withdrawals = Supply.from-list(30, 120);
my $balance = 0;
react {
whenever $deposits { $balance += $_ }
whenever $withdrawals { $balance -= $_ }
}
say $balance;🦋 Исходный код можно найти в файле two-whenevers.raku.
Вывод
200Комментарии
Два блока
wheneverследят за двумя именованными supply и реагируют по-разному: поступления прибавляются, списания вычитаются. Один блок react, два потока, две различные реакции — ради этого и заводят поwheneverна источник.Блок react завершается лишь тогда, когда закончатся оба supply, поэтому к моменту печати баланс уже окончательный:
100 + 50 + 200 - 30 - 120даёт200. Поскольку сложение и вычитание перестановочны, чередование двух потоков на результат не влияет.Здесь оба supply выдают свои значения мгновенно, один поток за другим. В жизни события банковского счёта приходят растянутыми во времени — поступление сейчас, списание через час, — и два потока переплетаются, как в примере Два таймера. Код при этом остаётся ровно тем же: блок react выполняет то тело
whenever, которое соответствует очередному пришедшему событию.
Навигация по курсу
← Два whenever | await →