Channel::send
(PHP 8.6+, True Async 1.0)
php
public Channel::send(mixed $value, ?Completable $cancellationToken = null): voidОтправляет значение в канал. Операция является блокирующей — текущая корутина приостанавливается, если канал не может принять значение немедленно.
Для канала-рандеву (capacity = 0) отправитель ждёт, пока другая корутина не вызовет recv(). Для буферизованного канала отправитель ждёт только тогда, когда буфер полон.
Параметры
value : Значение для отправки. Может быть любого типа.
cancellationToken : Токен отмены (Completable), позволяющий прервать ожидание по произвольному условию. null — ожидание без ограничений (по умолчанию). Когда токен завершается, операция прерывается и выбрасывается AsyncCancellation. Для ограничения по времени можно использовать Async\timeout().
Ошибки
- Выбрасывает
Async\ChannelException, если канал закрыт. - Выбрасывает
Async\AsyncCancellation, если токен отмены был завершён.
Примеры
Пример #1 Отправка значений в канал
php
<?php
use Async\Channel;
$channel = new Channel(1);
spawn(function() use ($channel) {
$channel->send('первое'); // помещается в буфер
$channel->send('второе'); // ждёт освобождения места
$channel->close();
});
spawn(function() use ($channel) {
echo $channel->recv() . "\n"; // "первое"
echo $channel->recv() . "\n"; // "второе"
});Пример #2 Отправка с таймаутом
php
<?php
use Async\Channel;
$channel = new Channel(0); // рандеву
spawn(function() use ($channel) {
try {
$channel->send('данные', Async\timeout(1000));
} catch (\Async\AsyncCancellation $e) {
echo "Таймаут: никто не принял значение за 1 секунду\n";
}
});Пример #3 Отправка с произвольным токеном отмены
php
<?php
use Async\Channel;
use Async\Future;
$channel = new Channel(0);
$cancel = new Future();
spawn(function() use ($channel, $cancel) {
try {
$channel->send('данные', $cancel);
} catch (\Async\AsyncCancellation $e) {
echo "Отправка отменена\n";
}
});
// Отменяем операцию из другой корутины
spawn(function() use ($cancel) {
Async\delay(500);
$cancel->complete(null);
});См. также
- Channel::sendAsync — Неблокирующая отправка
- Channel::recv — Получить значение из канала
- Channel::isFull — Проверить, полон ли буфер
- Channel::close — Закрыть канал