Channel::recv
(PHP 8.6+, True Async 1.0)
php
public Channel::recv(?Completable $cancellationToken = null): mixedEmpfängt den nächsten Wert vom Channel. Dies ist eine blockierende Operation — die aktuelle Coroutine wird suspendiert, wenn keine Werte im Channel verfügbar sind.
Wenn der Channel geschlossen und der Puffer leer ist, wird eine ChannelException ausgelöst. Wenn der Channel geschlossen ist, aber noch Werte im Puffer sind, werden diese zurückgegeben.
Parameter
cancellationToken : Abbruch-Token (Completable), das den Abbruch des Wartens nach beliebigen Bedingungen ermöglicht. null — unbegrenzt warten (Standard). Wenn das Token abgeschlossen wird, wird die Operation abgebrochen und eine AsyncCancellation ausgelöst. Für zeitbasierte Begrenzungen kann Async\timeout() verwendet werden.
Rückgabewerte
Der nächste Wert aus dem Channel (mixed).
Fehler
- Löst
Async\ChannelExceptionaus, wenn der Channel geschlossen und der Puffer leer ist. - Löst
Async\AsyncCancellationaus, wenn das Abbruch-Token abgeschlossen wurde.
Beispiele
Beispiel #1 Werte von einem Channel empfangen
php
<?php
use Async\Channel;
$channel = new Channel(5);
spawn(function() use ($channel) {
for ($i = 1; $i <= 5; $i++) {
$channel->send($i);
}
$channel->close();
});
spawn(function() use ($channel) {
try {
while (true) {
$value = $channel->recv();
echo "Empfangen: $value\n";
}
} catch (\Async\ChannelException) {
echo "Channel geschlossen und leer\n";
}
});Beispiel #2 Empfangen mit Timeout
php
<?php
use Async\Channel;
$channel = new Channel();
spawn(function() use ($channel) {
try {
$value = $channel->recv(Async\timeout(2000));
echo "Empfangen: $value\n";
} catch (\Async\AsyncCancellation) {
echo "Keine Daten innerhalb von 2 Sekunden empfangen\n";
}
});Beispiel #3 Empfangen mit benutzerdefiniertem Abbruch-Token
php
<?php
use Async\Channel;
use Async\Future;
$channel = new Channel();
$cancel = new Future();
spawn(function() use ($channel, $cancel) {
try {
$value = $channel->recv($cancel);
echo "Empfangen: $value\n";
} catch (\Async\AsyncCancellation) {
echo "Empfang abgebrochen\n";
}
});
// Aus einer anderen Coroutine abbrechen
spawn(function() use ($cancel) {
Async\delay(500);
$cancel->complete(null);
});Siehe auch
- Channel::recvAsync — Nicht-blockierendes Empfangen
- Channel::send — Einen Wert an den Channel senden
- Channel::isEmpty — Prüfen, ob der Puffer leer ist
- Channel::getIterator — Den Channel mit foreach iterieren