TaskSet::getIterator
(PHP 8.6+, True Async 1.0)
public TaskSet::getIterator(): Iterator
Gibt einen Iterator zurück, der Ergebnisse liefert, sobald Tasks abgeschlossen werden.
TaskSet implementiert IteratorAggregate, sodass foreach direkt verwendet werden kann.
Jeder verarbeitete Eintrag wird automatisch aus dem Set entfernt, wodurch Speicher
freigegeben und count() verringert wird.
Iterator-Verhalten
foreachsuspendiert die aktuelle Coroutine, bis das nächste Ergebnis verfügbar ist- Der Schlüssel entspricht dem bei
spawn()oderspawnWithKey()zugewiesenen Schlüssel - Der Wert ist ein Array
[mixed $result, ?Throwable $error]:- Erfolg:
[$result, null] - Fehler:
[null, $error]
- Erfolg:
- Die Iteration endet, wenn das Set versiegelt ist und alle Tasks verarbeitet wurden
- Wenn das Set nicht versiegelt ist, wartet
foreachauf neue Tasks
Wichtig: Ohne Aufruf von
seal()wartet die Iteration unbegrenzt.
Beispiele
Beispiel #1 Stream-Verarbeitung
<?php
use Async\TaskSet;
spawn(function() {
$set = new TaskSet(concurrency: 5);
for ($i = 0; $i < 100; $i++) {
$set->spawn(fn() => processItem($items[$i]));
}
$set->seal();
foreach ($set as $key => [$result, $error]) {
if ($error !== null) {
echo "Task $key: Fehler — {$error->getMessage()}\n";
continue;
}
echo "Task $key: fertig\n";
// Eintrag entfernt, Speicher freigegeben
}
echo $set->count() . "\n"; // 0
});
Beispiel #2 Benannte Schlüssel
<?php
use Async\TaskSet;
spawn(function() {
$set = new TaskSet();
$set->spawnWithKey('users', fn() => fetchUsers());
$set->spawnWithKey('orders', fn() => fetchOrders());
$set->seal();
foreach ($set as $key => [$result, $error]) {
if ($error === null) {
echo "$key: " . count($result) . " Datensätze empfangen\n";
}
}
});
Siehe auch
- TaskSet::seal — Das Set versiegeln
- TaskSet::joinAll — Auf alle Tasks warten
- TaskSet::joinNext — Nächstes Ergebnis