Scope::awaitAfterCancellation

(PHP 8.6+, True Async 1.0)

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

Wartet auf den Abschluss aller Koroutinen im Scope, einschliesslich Zombie-Koroutinen. Erfordert einen vorherigen Aufruf von cancel(). Diese Methode wird fuer ein geordnetes Beenden des Scopes verwendet, wenn Sie warten muessen, bis alle Koroutinen (einschliesslich Zombies) ihre Arbeit abgeschlossen haben.

Parameter

errorHandler — eine Callback-Funktion zur Behandlung von Zombie-Koroutinen-Fehlern. Akzeptiert ein \Throwable als Argument. Wenn null, werden Fehler ignoriert.

cancellation — ein Awaitable-Objekt zum Unterbrechen des Wartens. Wenn null, ist das Warten nicht zeitlich begrenzt.

Rueckgabewert

Es wird kein Wert zurueckgegeben.

Beispiele

Beispiel #1 Geordnetes Beenden mit Fehlerbehandlung

<?php

use Async\Scope;

$scope = new Scope();

$scope->spawn(function() {
    \Async\delay(1000);
    echo "Aufgabe abgeschlossen\n";
});

$scope->spawn(function() {
    \Async\delay(5000);
    throw new \RuntimeException("Fehler bei Hintergrundaufgabe");
});

// Zuerst abbrechen
$scope->cancel();

// Dann auf den Abschluss aller Koroutinen warten
$scope->awaitAfterCancellation(
    errorHandler: function(\Throwable $e) {
        error_log("Zombie-Fehler: " . $e->getMessage());
    }
);

Beispiel #2 Warten mit Timeout

<?php

use Async\Scope;
use function Async\timeout;

$scope = new Scope();

$scope->spawn(function() {
    // Zombie-Koroutine, die lange zum Beenden braucht
    try {
        \Async\delay(30_000);
    } catch (\Async\CancelledException) {
        // Ressourcenbereinigung
        \Async\delay(2000);
    }
});

$scope->cancel();

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

Siehe auch