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

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

Каналы   |   Тест — Каналы


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