Курс языка программирования 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

Комментарии

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

  2. await $producer, $consumer дожидается обоих промисов и возвращает их результаты по порядку. Результат производителя здесь не нужен ($sent), а результат потребителя — это сумма 21. Именно канал безопасно переносит значения из потока производителя в поток потребителя.

Навигация по курсу

Сумма из канала   |   Опустошите канал