Курс 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 тест за змістом цієї теми.

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

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


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