ComposantsThreadPool::map()

ThreadPool::map()

(PHP 8.6+, True Async 1.0)

php
public ThreadPool::map(array $items, callable $task): array

Soumet $task($item) pour chaque élément de $items aux workers du pool de façon concurrente, puis bloque la coroutine appelante jusqu'à ce que toutes les tâches soient terminées. Retourne les résultats dans le même ordre que le tableau d'entrée, quel que soit l'ordre dans lequel les workers se terminent.

Si une tâche lève une exception, map() la relève dans la coroutine appelante. Les autres tâches en cours ne sont pas annulées.

Paramètres

ParamètreTypeDescription
$itemsarrayLes éléments d'entrée. Chaque élément est passé comme premier argument à $task.
$taskcallableLe callable à appliquer à chaque élément. Exécuté dans un thread de travail ; les mêmes règles de transfert de données que submit() s'appliquent.

Valeur de retour

array — résultats de $task pour chaque élément d'entrée, dans le même ordre que $items.

Exceptions

  • Async\ThreadPoolException — si le pool a été fermé.
  • Relève la première exception levée par n'importe quelle tâche.

Exemples

Exemple #1 Compter les lignes de plusieurs fichiers en parallèle

php
<?php

use Async\ThreadPool;
use function Async\spawn;

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

    $files = ['/var/log/app.log', '/var/log/nginx.log', '/var/log/php.log'];

    $lineCounts = $pool->map($files, function(string $path) {
        if (!file_exists($path)) {
            return 0;
        }
        $count = 0;
        $fh = fopen($path, 'r');
        while (!feof($fh)) {
            fgets($fh);
            $count++;
        }
        fclose($fh);
        return $count;
    });

    foreach ($files as $i => $path) {
        echo "$path: {$lineCounts[$i]} lines\n";
    }

    $pool->close();
});

Exemple #2 Calcul numérique en parallèle

php
<?php

use Async\ThreadPool;
use function Async\spawn;

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

    $inputs = [1_000_000, 2_000_000, 3_000_000, 4_000_000];

    $results = $pool->map($inputs, function(int $n) {
        $sum = 0.0;
        for ($i = 0; $i < $n; $i++) {
            $sum += sqrt($i);
        }
        return $sum;
    });

    foreach ($inputs as $i => $n) {
        echo "$n iterations → {$results[$i]}\n";
    }

    $pool->close();
});

Voir aussi