Курс 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Коментарі
Обіцянка-виробник надсилає шість значень в одному потоці й закриває канал. Обіцянка-споживач, в іншому потоці, використовує
.list, щоб зібрати все до закриття, і повертає суму ([+]додає1 + 2 + … + 6).await $producer, $consumerчекає на обидві обіцянки й повертає їхні результати по порядку. Результат виробника тут не потрібен ($sent); результат споживача — це сума,21. Саме канал безпечно переносить значення з потоку виробника в потік споживача.