Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Конкурентное программирование / Каналы / Exercises / Сумма из канала
Решение: Сумма из канала
Вот один из возможных вариантов решения задачи.
Код
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. Именно канал безопасно переносит значения из потока производителя в поток потребителя.