TaskGroup::race

(PHP 8.6+, True Async 1.0)

public TaskGroup::race(): Async\Future

첫 번째로 완료된 태스크의 결과로 해결되는 Future를 반환합니다 — 성공이든 실패든 관계없이. 태스크가 오류로 실패한 경우, Future는 해당 예외로 거부됩니다. 나머지 태스크는 계속 실행됩니다.

이미 완료된 태스크가 있으면 Future는 즉시 해결됩니다.

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

반환값

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

오류

예제

예제 #1 첫 번째 응답

<?php

use Async\TaskGroup;
use function Async\delay;

spawn(function() {
    $group = new TaskGroup();

    $group->spawn(function() { delay(100); return "slow"; });
    $group->spawn(fn() => "fast");

    $winner = $group->race()->await();
    echo $winner . "\n"; // "fast"
});

예제 #2 타임아웃이 있는 헤지 요청

<?php

use Async\TaskGroup;

spawn(function() {
    $replicas = ['db-replica-1', 'db-replica-2', 'db-replica-3'];
    $group = new TaskGroup();

    foreach ($replicas as $host) {
        $group->spawn(fn() => pg_query($host, 'SELECT * FROM products WHERE id = 42'));
    }

    $timeout = Async\timeout(2.0);

    try {
        $product = $group->race()->await($timeout);
    } catch (Async\TimeoutException) {
        echo "2초 이내에 응답한 레플리카가 없습니다\n";
    }
});

참고