Channel::close
(PHP 8.6+, True Async 1.0)
public Channel::close(): void
Ferme le canal. Après la fermeture :
- L’appel à
send()lève uneChannelException. - L’appel à
recv()continue de retourner les valeurs du tampon jusqu’à ce qu’il soit vide. Ensuite,recv()lève uneChannelException. - Toutes les coroutines en attente dans
send()ourecv()reçoivent uneChannelException. - L’itération via
foreachse termine lorsque le tampon est vide.
Appeler close() à nouveau sur un canal déjà fermé ne provoque pas d’erreur.
Exemples
Exemple #1 Fermeture d’un canal après l’envoi de données
<?php
use Async\Channel;
$channel = new Channel(10);
spawn(function() use ($channel) {
for ($i = 0; $i < 5; $i++) {
$channel->send($i);
}
$channel->close(); // signal au récepteur qu'il n'y aura plus de données
});
spawn(function() use ($channel) {
foreach ($channel as $value) {
echo "Reçu : $value\n";
}
// foreach se termine après la fermeture et le vidage du tampon
echo "Canal épuisé\n";
});
Exemple #2 Gestion de la fermeture par les coroutines en attente
<?php
use Async\Channel;
$channel = new Channel();
spawn(function() use ($channel) {
try {
$channel->send('data'); // en attente d'un récepteur
} catch (\Async\ChannelException $e) {
echo "Canal fermé : {$e->getMessage()}\n";
}
});
spawn(function() use ($channel) {
delay(100); // court délai
$channel->close(); // débloque l'expéditeur avec une exception
});
Voir aussi
- Channel::isClosed — Vérifier si le canal est fermé
- Channel::recv — Recevoir une valeur (vide le tampon)
- Channel::getIterator — Itérer jusqu’à la fermeture