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

Закриття каналу

Коли у виробника більше немає значень для надсилання, він викликає на каналі .close. Закриття сигналізує споживачеві, що потік завершився.

Найзручніший спосіб спожити закритий канал — це .list, що дає вам кожне значення, яке залишилося, і завершується, щойно канал закрито:

my $c = Channel.new;
$c.send(1);
$c.send(2);
$c.send(3);
$c.close;

say $c.list; # (1 2 3)

Оскільки .list чекає закриття каналу, він ідеальний для «зібрати все, що надсилає виробник». Із результатом можна поводитися як із будь-яким іншим списком — підсумувати, порахувати тощо:

my $c = Channel.new;
$c.send($_) for 1..5;
$c.close;

say [+] $c.list; # 15

Закриття — це те, як споживач дізнається, коли зупинитися. Без нього .list (або цикл із .receive) чекав би вічно на значення, яке ніколи не прийде. Завжди закривайте канал, коли надсилання завершено.

Практика

Виконайте 1 тест за змістом цієї теми.

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

Тест — Канали   |   Тест — Закриття каналу


💪 Або перейдіть одразу до вправ цього розділу.