TaskGroup::any

(PHP 8.6+, True Async 1.0)

public TaskGroup::any(): Async\Future

첫 번째로 성공적으로 완료된 태스크의 결과로 해결되는 Future를 반환합니다. 오류로 실패한 태스크는 건너뜁니다. 나머지 태스크는 계속 실행됩니다.

모든 태스크가 오류로 실패한 경우, FutureCompositeException으로 거부됩니다.

반환된 Futureawait(?Completable $cancellation)를 통해 취소 토큰을 지원합니다.

반환값

Async\Future — 첫 번째로 성공한 태스크의 미래 결과입니다. ->await()를 호출하여 값을 얻습니다.

오류

예제

예제 #1 첫 번째 성공

<?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!"

    // 실패한 태스크의 오류는 명시적으로 억제해야 합니다
    $group->suppressErrors();
});

예제 #2 모두 실패

<?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()) . "개 오류\n"; // "2개 오류"
    }
});

예제 #3 타임아웃이 있는 복원력 있는 검색

<?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 "3초 이내에 응답한 제공자가 없습니다\n";
    }

    $group->suppressErrors();
});

참고