Coroutine::cancel
(PHP 8.6+, True Async 1.0)
php
public Coroutine::cancel(?Async\AsyncCancellation $cancellation = null): voidCancela la ejecución de la coroutine. La coroutine recibirá una excepción AsyncCancellation en el siguiente punto de suspensión (suspend, await, delay, etc.).
La cancelación funciona de forma cooperativa -- la coroutine no se interrumpe instantáneamente. Si la coroutine está dentro de protect(), la cancelación se aplaza hasta que la sección protegida se complete.
Parámetros
cancellation : La excepción que sirve como motivo de cancelación. Si es null, se crea un AsyncCancellation predeterminado.
Ejemplos
Ejemplo #1 Cancelación básica
php
<?php
use function Async\spawn;
use function Async\suspend;
use function Async\await;
$coroutine = spawn(function() {
try {
Async\delay(10000);
} catch (\Async\AsyncCancellation $e) {
echo "Cancelled: " . $e->getMessage() . "\n";
}
});
suspend();
$coroutine->cancel();
await($coroutine);Ejemplo #2 Cancelación con motivo
php
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
Async\delay(10000);
});
$coroutine->cancel(new \Async\AsyncCancellation("Timeout exceeded"));
try {
await($coroutine);
} catch (\Async\AsyncCancellation $e) {
echo $e->getMessage() . "\n"; // "Timeout exceeded"
}Ejemplo #3 Cancelación antes de iniciar
php
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
return "should not complete";
});
// Cancelar antes de que el planificador inicie la coroutine
$coroutine->cancel();
try {
await($coroutine);
} catch (\Async\AsyncCancellation $e) {
echo "Coroutine cancelled before start\n";
}Ver también
- Coroutine::isCancelled -- Verificar cancelación
- Coroutine::isCancellationRequested -- Verificar solicitud de cancelación
- Cancelación -- Concepto de cancelación
- protect() -- Sección protegida