Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Конкурентне програмування / Канали / Вправи / Сума з каналу

Розв’язання: Сума з каналу

Ось одне з можливих розв’язань задачі.

Код

my $c = Channel.new;

my $producer = start {
    $c.send($_) for 1..6;
    $c.close;
};

my $consumer = start {
    [+] $c.list;
};

my ($sent, $sum) = await $producer, $consumer;
say $sum;

🦋 Знайдіть програму у файлі channel-sum.raku.

Вивід

21

Коментарі

  1. Обіцянка-виробник надсилає шість значень в одному потоці й закриває канал. Обіцянка-споживач, в іншому потоці, використовує .list, щоб зібрати все до закриття, і повертає суму ([+] додає 1 + 2 + … + 6).

  2. await $producer, $consumer чекає на обидві обіцянки й повертає їхні результати по порядку. Результат виробника тут не потрібен ($sent); результат споживача — це сума, 21. Саме канал безпечно переносить значення з потоку виробника в потік споживача.

Навігація курсом

Сума з каналу   |   Спорожніть канал