Coroutine::cancel
(PHP 8.6+, True Async 1.0)
public Coroutine::cancel(?Async\AsyncCancellation $cancellation = null): void
Отменяет выполнение корутины. Корутина получит исключение AsyncCancellation при следующей точке приостановки (suspend, await, delay и т.д.).
Отмена работает кооперативно — корутина не прерывается мгновенно. Если корутина находится внутри protect(), отмена откладывается до завершения защищённой секции.
Параметры
- cancellation
- Исключение-причина отмены. Если
null— создаётся стандартныйAsyncCancellation.
Примеры
Пример #1 Базовая отмена
<?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 "Отменена: " . $e->getMessage() . "\n";
}
});
suspend();
$coroutine->cancel();
await($coroutine);
Пример #2 Отмена с причиной
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
Async\delay(10000);
});
$coroutine->cancel(new \Async\AsyncCancellation("Превышен таймаут"));
try {
await($coroutine);
} catch (\Async\AsyncCancellation $e) {
echo $e->getMessage() . "\n"; // "Превышен таймаут"
}
Пример #3 Отмена до запуска
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
return "should not complete";
});
// Отменяем до того, как планировщик запустит корутину
$coroutine->cancel();
try {
await($coroutine);
} catch (\Async\AsyncCancellation $e) {
echo "Корутина отменена до запуска\n";
}
См. также
- Coroutine::isCancelled — Проверить отмену
- Coroutine::isCancellationRequested — Проверить запрос
- Отмена — Концепция отмены
- protect() — Защищённая секция