Scope::awaitAfterCancellation

(PHP 8.6+, True Async 1.0)

public function awaitAfterCancellation(
    ?callable $errorHandler = null,
    ?Awaitable $cancellation = null
): void

Ожидает завершения всех корутин scope, включая zombie-корутины. Требует предварительного вызова cancel(). Этот метод используется для корректного завершения scope, когда необходимо дождаться, пока все корутины (в том числе zombie) завершат свою работу.

Параметры

errorHandler — функция обратного вызова для обработки ошибок zombie-корутин. Принимает \Throwable как аргумент. Если null, ошибки игнорируются.

cancellation — объект Awaitable для прерывания ожидания. Если null, ожидание не ограничено по времени.

Возвращаемое значение

Функция не возвращает значения.

Примеры

Пример #1 Корректное завершение с обработкой ошибок

<?php

use Async\Scope;

$scope = new Scope();

$scope->spawn(function() {
    \Async\delay(1000);
    echo "Задача завершена\n";
});

$scope->spawn(function() {
    \Async\delay(5000);
    throw new \RuntimeException("Ошибка фоновой задачи");
});

// Сначала отменяем
$scope->cancel();

// Затем ждём завершения всех корутин
$scope->awaitAfterCancellation(
    errorHandler: function(\Throwable $e) {
        error_log("Ошибка zombie: " . $e->getMessage());
    }
);

Пример #2 Ожидание с таймаутом

<?php

use Async\Scope;
use function Async\timeout;

$scope = new Scope();

$scope->spawn(function() {
    // Zombie-корутина, которая долго завершается
    try {
        \Async\delay(30_000);
    } catch (\Async\CancelledException) {
        // Очистка ресурсов
        \Async\delay(2000);
    }
});

$scope->cancel();

$scope->awaitAfterCancellation(
    errorHandler: function(\Throwable $e) {
        error_log($e->getMessage());
    },
    cancellation: timeout(5000)
);

См. также