ThreadChannel::isEmpty
(PHP 8.6+, True Async 1.0)
php
public ThreadChannel::isEmpty(): boolGibt true zurück, wenn der Kanalpuffer keine Werte enthält.
Bei einem ungepufferten Kanal (capacity = 0) gibt dies immer true zurück, da Daten direkt zwischen Threads ohne Pufferung übertragen werden.
isEmpty() ist thread-sicher. Das Ergebnis spiegelt den Zustand zum Zeitpunkt des Aufrufs wider; ein anderer Thread kann unmittelbar danach einen Wert in den Kanal legen.
Rückgabewerte
true — der Puffer ist leer (keine Werte verfügbar). false — der Puffer enthält mindestens einen Wert.
Beispiele
Beispiel #1 Vor dem Empfangen auf gepufferte Daten prüfen
php
<?php
use Async\ThreadChannel;
$channel = new ThreadChannel(5);
echo $channel->isEmpty() ? "leer" : "hat Daten"; // "leer"
$channel->send(42);
echo $channel->isEmpty() ? "leer" : "hat Daten"; // "hat Daten"
$channel->recv();
echo $channel->isEmpty() ? "leer" : "hat Daten"; // "leer"Beispiel #2 Konsument, der einen geschlossenen Kanal leert
php
<?php
use Async\ThreadChannel;
use function Async\spawn;
use function Async\spawn_thread;
use function Async\await;
spawn(function() {
$channel = new ThreadChannel(50);
$producer = spawn_thread(function() use ($channel) {
for ($i = 0; $i < 20; $i++) {
$channel->send($i);
}
$channel->close();
});
$consumer = spawn_thread(function() use ($channel) {
// Warten, bis etwas zu lesen ist oder der Kanal geschlossen wird
while (!$channel->isClosed() || !$channel->isEmpty()) {
if ($channel->isEmpty()) {
// Puffer momentan leer — zurückgeben und erneut versuchen
continue;
}
try {
echo $channel->recv(), "\n";
} catch (\Async\ThreadChannelException) {
break;
}
}
});
await($producer);
await($consumer);
});Siehe auch
- ThreadChannel::isFull — Prüfen, ob der Puffer voll ist
- ThreadChannel::count — Anzahl der Werte im Puffer
- ThreadChannel::recv — Einen Wert empfangen
- ThreadChannel-Komponentenübersicht