Coroutine::cancel
(PHP 8.6+, True Async 1.0)
public Coroutine::cancel(?Async\AsyncCancellation $cancellation = null): void
Cancela 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 unAsyncCancellationpredeterminado.
Ejemplos
Ejemplo #1 Cancelación básica
<?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
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
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