Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Реактивне програмування / Живі supply та supply на вимогу

Живі supply у дії

Оскільки живий потік транслює тим підключенням, що слухають у цю мить, кілька слухачів можуть стежити за тим самим струменем водночас — і кожен вільний приєднатися чи піти коли завгодно. Тут два слухачі спостерігають за потоком подій: log, що записує все, та alert, що приєднується пізніше й іде раніше.

my $supplier = Supplier.new;
my $events   = $supplier.Supply;

my $log = $events.tap(-> $v { say "log:   $v" });    # приєднується перший слухач
$supplier.emit('start');

my $alert = $events.tap(-> $v { say "alert: $v" });  # приєднується другий слухач
$supplier.emit('warning');
$supplier.emit('all clear');

$log.close;                                          # перший слухач іде
$supplier.emit('stop');

Це друкує:

log:   start
log:   warning
alert: warning
log:   all clear
alert: all clear
alert: stop

Життєвий цикл двох підключень вишиковується так: 🟢 позначає приєднання підключення, 🔴 — його вихід, а ✅ — кожне значення, яке підключення справді отримало:

Крок log alert
$events.taplog 🟢 приєднується
emit 'start' ✅ start
$events.tapalert 🟢 приєднується
emit 'warning' ✅ warning ✅ warning
emit 'all clear' ✅ all clear ✅ all clear
$log.close 🔴 іде
emit 'stop' ✅ stop

Порожня комірка означає, що це підключення не слухало, коли значення виходило. Простежте часову лінію:

  • .tap повертає об’єкт Tap — держак, який ви тримаєте, щоб керувати саме цією підпискою.
  • start видано тоді, коли слухає лише log, тож лише log його й бачить. Це знову те саме правило живого потоку: alert приєднався після start, а живий потік не програє минулого наново, тож alert ніколи його не побачить.
  • warning та all clear видано тоді, коли підключені обидва, тож кожне значення доходить до обох — у порядку, у якому підключення підписалися: спершу log, потім alert.
  • Виклик $log.close виводить з потоку. Відтоді log не отримує нічого, тож останнє stop доходить лише до alert.

Два висновки. По-перше, один живий потік може віялом розходитися на багато незалежних підключень водночас. По-друге, кожне підключення є власною підпискою з власним часом життя: тримайтеся за об’єкт Tap, який повертає .tap, — і ви зможете завершити саме цього слухача через .close, не турбуючи інших.

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

Живі supply   |   Два підключення


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