Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Конкурентное программирование / Каналы
Отправка и получение
Канал создаётся через Channel.new. Значения кладут в
него методом .send, а забирают методом
.receive:
my $c = Channel.new;
$c.send(1);
$c.send(2);
say $c.receive; # 1
say $c.receive; # 2Канал — это очередь: значения выходят в том же
порядке, в каком вошли, — первым пришёл, первым вышел. Поэтому первый
.receive возвращает 1, значение, отправленное
первым.
Смысл канала в том, что отправлять и получать безопасно из разных потоков одновременно. Производитель может продолжать отправку, пока потребитель продолжает приём, и Raku гарантирует, что ни одно значение не потеряется и не задвоится:
my $c = Channel.new;
start {
$c.send($_) for 1..3;
$c.close;
}
say $c.receive; # 1Здесь фоновая задача отправляет 1, 2, 3, а основная
программа принимает. .receive ждёт, если канал на мгновение
пуст, поэтому потребитель никогда не убегает вперёд производителя.
Практика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← Каналы | Тест — Каналы →
💪 Или перейдите сразу к упражнениям этого
раздела.