DokumentationThreadPool::__construct()

ThreadPool::__construct()

(PHP 8.6+, True Async 1.0)

php
public ThreadPool::__construct(
    int $workers = 0,
    int $queueSize = 0,
    ?\Closure $bootloader = null,
    bool $coroutine = false,
    int $concurrency = 0,
)

Erstellt einen neuen Thread-Pool und startet alle Worker-Threads sofort. Die Worker bleiben für die gesamte Lebensdauer des Pools aktiv, wodurch der Thread-Startaufwand pro Aufgabe entfällt.

Parameter

ParameterTypBeschreibung
$workersintAnzahl der Worker-Threads. 0 (Default) — Autodetect über Async\available_parallelism().
$queueSizeintMaximale Länge der ausstehenden Aufgaben-Warteschlange. 0 (Default) — workers × 4. Ist die Warteschlange voll, suspendiert submit() die aufrufende Coroutine, bis ein Slot frei wird.
$bootloader?\ClosureWorker-Startup-Initialisierung. Die Closure wird einmal deep-copiert und in jedem Worker vor dem eigentlichen Task-Loop ausgeführt. Praktisch für Autoload, Connection-Pool-Warmup, Opcache-Precompilation. Wirft der Bootloader eine Exception, gilt der gesamte Pool als nicht gestartet.
$coroutineboolBei true läuft jeder Task als Coroutine in einem eigenen Child-Scope, eingebettet in den gemeinsamen Pool-Scope des Workers. Innerhalb des Tasks dürfen await, Channels, IO und spawn verwendet werden — alles, ohne den OS-Thread zu blockieren.
$concurrencyintLimit gleichzeitig lebender Coroutinen innerhalb eines Workers. Nur bei coroutine: true wirksam. 0 (Default) — unbegrenzt.

Ausnahmen

Wirft \ValueError, wenn $workers < 0 oder $queueSize < 0.

Beispiele

Beispiel #1 Einfache Pool-Erstellung

php
<?php

use Async\ThreadPool;
use function Async\spawn;
use function Async\await;

spawn(function() {
    // 4 Worker, Warteschlangengröße standardmäßig 16
    $pool = new ThreadPool(workers: 4);

    $future = $pool->submit(fn() => 'hello from worker');
    echo await($future), "\n"; // hello from worker

    $pool->close();
});

Beispiel #2 Explizite Warteschlangengröße

php
<?php

use Async\ThreadPool;
use function Async\spawn;

spawn(function() {
    // 4 Worker, Warteschlange auf 64 ausstehende Aufgaben begrenzt
    $pool = new ThreadPool(workers: 4, queueSize: 64);

    // ... Aufgaben einreichen ...

    $pool->close();
});

Beispiel #3 Bootloader — Worker-Initialisierung

php
<?php

use Async\ThreadPool;
use function Async\spawn;

spawn(function () {
    $pool = new ThreadPool(
        workers: 4,
        bootloader: function () {
            require __DIR__ . '/vendor/autoload.php';
            App\Container::boot();
            App\Database::warmupPool(min: 4, max: 16);
        },
    );

    // ... übermittelte Tasks sehen ein vollständig initialisiertes Environment ...

    $pool->close();
});

Beispiel #4 Coroutine-Mode — innerhalb des Tasks dürfen Sie await nutzen

php
<?php

use Async\ThreadPool;
use function Async\spawn;
use function Async\await;

spawn(function () {
    $pool = new ThreadPool(workers: 4, coroutine: true);

    $future = $pool->submit(function () {
        // Ein regulärer blockierender Aufruf parkt die Coroutine korrekt
        // und blockiert nicht den OS-Thread des Workers
        $pdo  = new PDO('mysql:host=localhost;dbname=app', 'user', 'pass');
        $rows = $pdo->query('SELECT * FROM users LIMIT 10')->fetchAll();
        return $rows;
    });

    print_r(await($future));
    $pool->close();
});

Beispiel #5 Autodetect der Worker-Zahl anhand der verfügbaren CPUs

php
<?php

use Async\ThreadPool;

// workers: 0 (Default) → Async\available_parallelism()
$pool = new ThreadPool();   // berücksichtigt cgroup-Quota / Affinity des Containers

Siehe auch