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('data'); // очікування на отримувача
} catch (\Async\ChannelException $e) {
echo "Канал закрито: {$e->getMessage()}\n";
}
});
spawn(function() use ($channel) {
delay(100); // коротка затримка
$channel->close(); // розблокує відправника з виключенням
});
Дивіться також
- Channel::isClosed — Перевірити, чи канал закрито
- Channel::recv — Отримати значення (вичерпує буфер)
- Channel::getIterator — Ітерація до закриття