Курс языка программирования 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 тест по содержанию этой темы.

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

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


💪 Или перейдите сразу к упражнениям этого раздела.