TaskGroup::any
(PHP 8.6+, True Async 1.0)
public TaskGroup::any(): Async\Future
Restituisce un Future che si risolve con il risultato del primo task completato con successo.
I task falliti con errore vengono ignorati.
I task rimanenti continuano l’esecuzione.
Se tutti i task falliscono con errori, il Future viene rifiutato con CompositeException.
Il Future restituito supporta un token di cancellazione tramite await(?Completable $cancellation).
Valore di ritorno
Async\Future — un risultato futuro del primo task riuscito.
Chiama ->await() per ottenere il valore.
Errori
- Lancia
Async\AsyncExceptionse il gruppo è vuoto. - Il
Futureviene rifiutato conAsync\CompositeExceptionse tutti i task falliscono con errori.
Esempi
Esempio #1 Primo riuscito
<?php
use Async\TaskGroup;
spawn(function() {
$group = new TaskGroup();
$group->spawn(fn() => throw new \RuntimeException("fail 1"));
$group->spawn(fn() => throw new \RuntimeException("fail 2"));
$group->spawn(fn() => "success!");
$result = $group->any()->await();
echo $result . "\n"; // "success!"
// Gli errori dei task falliti devono essere soppressi esplicitamente
$group->suppressErrors();
});
Esempio #2 Tutti falliti
<?php
use Async\TaskGroup;
spawn(function() {
$group = new TaskGroup();
$group->spawn(fn() => throw new \RuntimeException("err 1"));
$group->spawn(fn() => throw new \RuntimeException("err 2"));
$group->seal();
try {
$group->any()->await();
} catch (\Async\CompositeException $e) {
echo count($e->getExceptions()) . " errori\n"; // "2 errori"
}
});
Esempio #3 Ricerca resiliente con timeout
<?php
use Async\TaskGroup;
spawn(function() {
$group = new TaskGroup();
$group->spawn(fn() => searchGoogle($query));
$group->spawn(fn() => searchBing($query));
$group->spawn(fn() => searchDuckDuckGo($query));
$timeout = Async\timeout(3.0);
try {
$result = $group->any()->await($timeout);
} catch (Async\TimeoutException) {
echo "Nessun provider ha risposto entro 3 secondi\n";
}
$group->suppressErrors();
});
Vedi anche
- TaskGroup::race — Primo completato (successo o errore)
- TaskGroup::all — Tutti i risultati