TaskGroup::race

(PHP 8.6+, True Async 1.0)

public TaskGroup::race(): Async\Future

Restituisce un Future che si risolve con il risultato del primo task completato — sia con successo che con errore. Se il task è fallito con un errore, il Future viene rifiutato con quell’eccezione. I task rimanenti continuano l’esecuzione.

Se un task completato esiste già, il Future si risolve immediatamente.

Il Future restituito supporta un token di cancellazione tramite await(?Completable $cancellation).

Valore di ritorno

Async\Future — un risultato futuro del primo task completato. Chiama ->await() per ottenere il valore.

Errori

Esempi

Esempio #1 Prima risposta

<?php

use Async\TaskGroup;
use function Async\delay;

spawn(function() {
    $group = new TaskGroup();

    $group->spawn(function() { delay(100); return "slow"; });
    $group->spawn(fn() => "fast");

    $winner = $group->race()->await();
    echo $winner . "\n"; // "fast"
});

Esempio #2 Richieste hedged con timeout

<?php

use Async\TaskGroup;

spawn(function() {
    $replicas = ['db-replica-1', 'db-replica-2', 'db-replica-3'];
    $group = new TaskGroup();

    foreach ($replicas as $host) {
        $group->spawn(fn() => pg_query($host, 'SELECT * FROM products WHERE id = 42'));
    }

    $timeout = Async\timeout(2.0);

    try {
        $product = $group->race()->await($timeout);
    } catch (Async\TimeoutException) {
        echo "Nessuna replica ha risposto entro 2 secondi\n";
    }
});

Vedi anche