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";
        }
    }
});

参见