Курс по 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. Именно каналът безопасно пренася стойностите от нишката на производителя към нишката на потребителя.

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

Сума от канал   |   Изпразнете канал