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 un AsyncCancellation predeterminado.

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