DocumentationThreadPool::__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,
)

Crée un nouveau pool de threads et démarre immédiatement tous les threads de travail. Les workers restent actifs pendant toute la durée de vie du pool, éliminant le surcoût de démarrage de thread par tâche.

Paramètres

ParamètreTypeDescription
$workersintNombre de threads de travail. 0 (défaut) : autodétection via Async\available_parallelism().
$queueSizeintLongueur maximale de la file d'attente. 0 (défaut) : workers × 4. Quand la file est pleine, submit() suspend la coroutine appelante jusqu'à ce qu'un emplacement se libère.
$bootloader?\ClosureInitialisation de démarrage par worker. La closure est deep-copy'ée une fois et exécutée dans chaque worker avant la boucle principale. Pratique pour l'autoload, le warmup des pools de connexions, la précompilation opcache. Si le bootloader lève une exception, tout le pool est considéré comme en échec.
$coroutineboolSi true : chaque tâche démarre comme une coroutine dans son scope enfant, imbriqué dans le scope commun du worker. À l'intérieur de la tâche, on peut await, utiliser des channels, des E/S et spawn — tout sans bloquer le thread OS.
$concurrencyintLimite de coroutines vivantes simultanément dans un worker. Utilisé seulement avec coroutine: true. 0 (défaut) : sans limite.

Exceptions

Lève \ValueError si $workers < 0 ou $queueSize < 0.

Exemples

Exemple #1 Création basique d'un pool

php
<?php

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

spawn(function() {
    // 4 workers, taille de la file par défaut : 16
    $pool = new ThreadPool(workers: 4);

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

    $pool->close();
});

Exemple #2 Taille de file explicite

php
<?php

use Async\ThreadPool;
use function Async\spawn;

spawn(function() {
    // 4 workers, file limitée à 64 tâches en attente
    $pool = new ThreadPool(workers: 4, queueSize: 64);

    // ... soumettre des tâches ...

    $pool->close();
});

Exemple #3 Bootloader — initialisation de démarrage du worker

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);
        },
    );

    // ... les submit verront un environnement entièrement initialisé ...

    $pool->close();
});

Exemple #4 Mode coroutine — on peut faire await à l'intérieur d'une tâche

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 () {
        // l'appel bloquant habituel parque correctement la coroutine
        // au lieu de bloquer le thread OS du worker
        $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();
});

Exemple #5 Autodétection du nombre de workers selon les CPU disponibles

php
<?php

use Async\ThreadPool;

// workers: 0 (défaut) → Async\available_parallelism()
$pool = new ThreadPool();   // prend en compte le quota cgroup / l'affinity du conteneur

Voir aussi