KomponentenThreadChannel::isClosed()

ThreadChannel::isClosed ​

(PHP 8.6+, True Async 1.0)

php
public ThreadChannel::isClosed(): bool

Gibt true zurück, wenn der Kanal über close() geschlossen wurde.

Ein geschlossener Kanal akzeptiert keine neuen Werte über send(), aber recv() gibt weiterhin alle im Puffer verbliebenen Werte zurück, bis dieser geleert ist.

isClosed() ist thread-sicher und kann ohne Synchronisierung von jedem Thread aus aufgerufen werden.

Rückgabewerte ​

true — der Kanal ist geschlossen. false — der Kanal ist offen.

Beispiele ​

Beispiel #1 Kanalzustand vom Haupt-Thread aus prüfen ​

php
<?php

use Async\ThreadChannel;
use function Async\spawn;
use function Async\spawn_thread;
use function Async\await;

spawn(function() {
    $channel = new ThreadChannel(5);

    echo $channel->isClosed() ? "geschlossen" : "offen"; // "offen"

    $channel->send('data');
    $channel->close();

    echo $channel->isClosed() ? "geschlossen" : "offen"; // "geschlossen"

    // Vor dem Schließen gepufferte Werte sind noch lesbar
    echo $channel->recv(), "\n"; // "data"
});

Beispiel #2 Konsumentenschleife mit isClosed() absichern ​

php
<?php

use Async\ThreadChannel;
use function Async\spawn;
use function Async\spawn_thread;
use function Async\await;

spawn(function() {
    $channel = new ThreadChannel(20);

    $producer = spawn_thread(function() use ($channel) {
        for ($i = 0; $i < 10; $i++) {
            $channel->send($i);
        }
        $channel->close();
    });

    $consumer = spawn_thread(function() use ($channel) {
        // Lesen, bis geschlossen UND Puffer leer ist
        while (!$channel->isClosed() || !$channel->isEmpty()) {
            try {
                echo $channel->recv(), "\n";
            } catch (\Async\ThreadChannelException) {
                break;
            }
        }
    });

    await($producer);
    await($consumer);
});

Siehe auch ​