TaskGroup::race

(PHP 8.6+, True Async 1.0)

public TaskGroup::race(): Async\Future

Повертає Future, який завершується з результатом першої завершеної задачі — незалежно від того, успішно чи з помилкою. Якщо задача завершилась з помилкою, Future відхиляється з цим винятком. Решта задач продовжують виконання.

Якщо вже є завершена задача, Future завершується негайно.

Повернений Future підтримує токен скасування через await(?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";
    }
});

Дивіться також