Channel::send

(PHP 8.6+, True Async 1.0)

public Channel::send(mixed $value, ?Completable $cancellationToken = null): void

Відправляє значення в канал. Це блокуюча операція — поточна корутина призупиняється, якщо канал не може прийняти значення негайно.

Для каналу рандеву (capacity = 0) відправник чекає, доки інша корутина не викличе recv(). Для буферизованого каналу відправник чекає лише тоді, коли буфер заповнений.

Параметри

value
Значення для відправлення. Може бути будь-якого типу.
cancellationToken
Токен скасування (Completable), що дає змогу перервати очікування за довільною умовою. null — очікування без обмежень (за замовчуванням). Коли токен завершується, операція переривається і кидається CancelledException. Для обмеження за часом можна використовувати Async\timeout().

Помилки

Приклади

Приклад #1 Відправлення значень у канал

<?php

use Async\Channel;

$channel = new Channel(1);

spawn(function() use ($channel) {
    $channel->send('first');  // розміщено в буфері
    $channel->send('second'); // чекає звільнення місця
    $channel->close();
});

spawn(function() use ($channel) {
    echo $channel->recv() . "\n"; // "first"
    echo $channel->recv() . "\n"; // "second"
});

Приклад #2 Відправлення з тайм-аутом

<?php

use Async\Channel;

$channel = new Channel(0); // рандеву

spawn(function() use ($channel) {
    try {
        $channel->send('data', Async\timeout(1000));
    } catch (\Async\CancelledException $e) {
        echo "Тайм-аут: ніхто не прийняв значення протягом 1 секунди\n";
    }
});

Приклад #3 Відправлення з довільним токеном скасування

<?php

use Async\Channel;
use Async\Future;

$channel = new Channel(0);
$cancel = new Future();

spawn(function() use ($channel, $cancel) {
    try {
        $channel->send('data', $cancel);
    } catch (\Async\CancelledException $e) {
        echo "Відправлення скасовано\n";
    }
});

// Скасовуємо операцію з іншої корутини
spawn(function() use ($cancel) {
    Async\delay(500);
    $cancel->complete(null);
});

Дивіться також