Channel::close
(PHP 8.6+, True Async 1.0)
public Channel::close(): void
Закрывает канал. После закрытия:
- Вызов
send()выбрасываетChannelException. - Вызов
recv()продолжает возвращать значения из буфера, пока он не опустеет. После этогоrecv()выбрасываетChannelException. - Все корутины, ожидающие в
send()илиrecv(), получаютChannelException. - Итерация через
foreachзавершается, когда буфер опустеет.
Повторный вызов close() на уже закрытом канале не вызывает ошибок.
Примеры
Пример #1 Закрытие канала после отправки данных
<?php
use Async\Channel;
$channel = new Channel(10);
spawn(function() use ($channel) {
for ($i = 0; $i < 5; $i++) {
$channel->send($i);
}
$channel->close(); // сигнал получателю, что данных больше не будет
});
spawn(function() use ($channel) {
foreach ($channel as $value) {
echo "Получено: $value\n";
}
// foreach завершится после закрытия и опустошения буфера
echo "Канал исчерпан\n";
});
Пример #2 Обработка закрытия ожидающими корутинами
<?php
use Async\Channel;
$channel = new Channel();
spawn(function() use ($channel) {
try {
$channel->send('данные'); // ожидает получателя
} catch (\Async\ChannelException $e) {
echo "Канал закрыт: {$e->getMessage()}\n";
}
});
spawn(function() use ($channel) {
delay(100); // небольшая задержка
$channel->close(); // разблокирует отправителя с исключением
});
См. также
- Channel::isClosed — Проверить, закрыт ли канал
- Channel::recv — Получить значение (дочитывает буфер)
- Channel::getIterator — Итерация до закрытия