TaskGroup::getIterator
(PHP 8.6+, True Async 1.0)
public TaskGroup::getIterator(): Iterator
Restituisce un iteratore che produce risultati man mano che i task vengono completati.
TaskGroup implementa IteratorAggregate, quindi è possibile utilizzare foreach direttamente.
Comportamento dell’iteratore
foreachsospende la coroutine corrente fino a quando il prossimo risultato è disponibile- La chiave è la stessa assegnata tramite
spawn()ospawnWithKey() - Il valore è un array
[mixed $result, ?Throwable $error]:- Successo:
[$result, null] - Errore:
[null, $error]
- Successo:
- L’iterazione termina quando il gruppo è sigillato e tutti i task sono stati elaborati
- Se il gruppo non è sigillato,
foreachsi sospende in attesa di nuovi task
Importante: Senza chiamare
seal(), l’iterazione attenderà indefinitamente.
Esempi
Esempio #1 Elaborazione dei risultati man mano che diventano disponibili
<?php
use Async\TaskGroup;
spawn(function() {
$group = new TaskGroup(concurrency: 3);
for ($i = 0; $i < 10; $i++) {
$group->spawn(fn() => fetchUrl($urls[$i]));
}
$group->seal();
foreach ($group as $key => [$result, $error]) {
if ($error !== null) {
echo "Task $key fallito: {$error->getMessage()}\n";
continue;
}
echo "Task $key completato\n";
}
});
Esempio #2 Iterazione con chiavi denominate
<?php
use Async\TaskGroup;
spawn(function() {
$group = new TaskGroup();
$group->spawnWithKey('users', fn() => fetchUsers());
$group->spawnWithKey('orders', fn() => fetchOrders());
$group->seal();
foreach ($group as $key => [$result, $error]) {
if ($error === null) {
echo "$key: ricevuti " . count($result) . " record\n";
}
}
});
Vedi anche
- TaskGroup::seal — Sigilla il gruppo
- TaskGroup::all — Attende tutti i task
- TaskGroup::getResults — Ottiene un array di risultati