Channel::recv
(PHP 8.6+, True Async 1.0)
public Channel::recv(?Completable $cancellationToken = null): mixed
Empfä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 eineCancelledExceptionausgelöst. Für zeitbasierte Begrenzungen kannAsync\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\CancelledExceptionaus, wenn das Abbruch-Token abgeschlossen wurde.
Beispiele
Beispiel #1 Werte von einem Channel empfangen
<?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
use Async\Channel;
$channel = new Channel();
spawn(function() use ($channel) {
try {
$value = $channel->recv(Async\timeout(2000));
echo "Empfangen: $value\n";
} catch (\Async\CancelledException) {
echo "Keine Daten innerhalb von 2 Sekunden empfangen\n";
}
});
Beispiel #3 Empfangen mit benutzerdefiniertem Abbruch-Token
<?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\CancelledException) {
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