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
- Scope::cancel — Alle Koroutinen abbrechen
- Scope::awaitCompletion — Auf aktive Koroutinen warten
- Scope::dispose — Abbrechen und den Scope schliessen