TaskGroup::getIterator
(PHP 8.6+, True Async 1.0)
php
public TaskGroup::getIterator(): IteratorПовертає ітератор, що видає результати у міру завершення задач. TaskGroup реалізує IteratorAggregate, тому можна використовувати foreach напряму.
Поведінка ітератора
foreachпризупиняє поточну корутину до появи наступного результату- Ключ відповідає тому, що призначено через
spawn()абоspawnWithKey() - Значення --- масив
[mixed $result, ?Throwable $error]:- Успіх:
[$result, null] - Помилка:
[null, $error]
- Успіх:
- Ітерація завершується, коли група запечатана і всі задачі оброблені
- Якщо група не запечатана,
foreachпризупиняється в очікуванні нових задач
Важливо: Без виклику
seal()ітерація чекатиме нескінченно.
Приклади
Приклад #1 Обробка результатів у міру готовності
php
<?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 "Задача $key невдала: {$error->getMessage()}\n";
continue;
}
echo "Задача $key завершена\n";
}
});Приклад #2 Ітерація з іменованими ключами
php
<?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: отримано " . count($result) . " записів\n";
}
}
});Дивіться також
- TaskGroup::seal --- Запечатати групу
- TaskGroup::all --- Дочекатися всіх задач
- TaskGroup::getResults --- Отримати масив результатів