KomponentenThreadChannel::count()

ThreadChannel::count ​

(PHP 8.6+, True Async 1.0)

php
public ThreadChannel::count(): int

Gibt die aktuelle Anzahl der im Puffer des Kanals gehaltenen Werte zurück.

ThreadChannel implementiert das Countable-Interface, sodass Sie auch count($channel) verwenden können.

Bei einem ungepufferten Kanal (capacity = 0) gibt dies immer 0 zurück — Werte werden direkt zwischen Threads übertragen, ohne Pufferung.

Die Anzahl wird atomar gelesen und ist zum Zeitpunkt des Aufrufs genau, auch wenn andere Threads gleichzeitig senden oder empfangen.

Rückgabewerte ​

Die Anzahl der aktuell im Puffer vorhandenen Werte (int).

Beispiele ​

Beispiel #1 Pufferfüllstand überwachen ​

php
<?php

use Async\ThreadChannel;

$channel = new ThreadChannel(10);

$channel->send('a');
$channel->send('b');
$channel->send('c');

echo $channel->count();   // 3
echo count($channel);     // 3 — Countable-Interface

$channel->recv();
echo $channel->count();   // 2

Beispiel #2 Kanalauslastung aus einem Monitor-Thread protokollieren ​

php
<?php

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

spawn(function() {
    $tasks = new ThreadChannel(100);

    // Monitor-Thread: protokolliert periodisch die Pufferauslastung
    $monitor = spawn_thread(function() use ($tasks) {
        while (!$tasks->isClosed()) {
            $pct = $tasks->capacity() > 0
                ? round($tasks->count() / $tasks->capacity() * 100)
                : 0;
            echo "Puffer: {$tasks->count()}/{$tasks->capacity()} ({$pct}%)\n";
            // In einem echten Thread würden Sie hier sleep() oder ein Semaphore verwenden
        }
    });

    // ... Produzenten- und Konsumenten-Threads ...

    $tasks->close();
    await($monitor);
});

Siehe auch ​