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 "Cancelled: " . $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("Timeout exceeded"));
try {
await($coroutine);
} catch (\Async\AsyncCancellation $e) {
echo $e->getMessage() . "\n"; // "Timeout exceeded"
}
Приклад #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 "Coroutine cancelled before start\n";
}
Дивіться також
- Coroutine::isCancelled – Перевірка скасування
- Coroutine::isCancellationRequested – Перевірка запиту на скасування
- Cancellation – Концепція скасування
- protect() – Захищена секція