Курс языка программирования 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 тест по содержанию этой темы.
Навигация по курсу
← Тест — Каналы | Тест — Закрытие канала →
💪 Или перейдите сразу к упражнениям этого
раздела.