suspend
(PHP 8.6+, True Async 1.0)
suspend() — Призупиняє виконання поточної корутини
Опис
suspend: void
Призупиняє виконання поточної корутини та передає управління планувальнику. Виконання корутини буде відновлено пізніше, коли планувальник вирішить її запустити.
suspend() — це функція, надана розширенням True Async.
Параметри
Ця конструкція не має параметрів.
Значення, що повертаються
Функція не повертає значення.
Приклади
Приклад #1 Базове використання suspend
<?php
use function Async\spawn;
spawn(function() {
echo "Before suspend\n";
suspend();
echo "After suspend\n";
});
echo "Main code\n";
?>
Вивід:
Before suspend
Main code
After suspend
Приклад #2 Декілька suspend
<?php
use function Async\spawn;
spawn(function() {
for ($i = 1; $i <= 3; $i++) {
echo "Iteration $i\n";
suspend();
}
});
echo "Coroutine started\n";
?>
Вивід:
Iteration 1
Coroutine started
Iteration 2
Iteration 3
Приклад #3 Кооперативна багатозадачність
<?php
use function Async\spawn;
spawn(function() {
for ($i = 1; $i <= 5; $i++) {
echo "Coroutine A: $i\n";
suspend(); // Дати іншим корутинам можливість виконатися
}
});
spawn(function() {
for ($i = 1; $i <= 5; $i++) {
echo "Coroutine B: $i\n";
suspend();
}
});
?>
Вивід:
Coroutine A: 1
Coroutine B: 1
Coroutine A: 2
Coroutine B: 2
Coroutine A: 3
Coroutine B: 3
...
Приклад #4 Явна передача управління
<?php
use function Async\spawn;
spawn(function() {
echo "Starting long work\n";
for ($i = 0; $i < 1000000; $i++) {
// Обчислення
if ($i % 100000 === 0) {
suspend(); // Періодично передавати управління
}
}
echo "Work completed\n";
});
spawn(function() {
echo "Other coroutine is also working\n";
});
?>
Приклад #5 suspend з вкладених функцій
suspend() працює з будь-якої глибини виклику — його не потрібно викликати безпосередньо з корутини:
<?php
use function Async\spawn;
function nestedSuspend() {
echo "Nested function: before suspend\n";
suspend();
echo "Nested function: after suspend\n";
}
function deeplyNested() {
echo "Deep call: start\n";
nestedSuspend();
echo "Deep call: end\n";
}
spawn(function() {
echo "Coroutine: before nested call\n";
deeplyNested();
echo "Coroutine: after nested call\n";
});
spawn(function() {
echo "Other coroutine: working\n";
});
?>
Вивід:
Coroutine: before nested call
Deep call: start
Nested function: before suspend
Other coroutine: working
Nested function: after suspend
Deep call: end
Coroutine: after nested call
Приклад #6 suspend у циклі очікування
<?php
use function Async\spawn;
$ready = false;
spawn(function() use (&$ready) {
// Чекати, поки прапорець стане true
while (!$ready) {
suspend(); // Передати управління
}
echo "Condition met!\n";
});
spawn(function() use (&$ready) {
echo "Preparing...\n";
Async\sleep(2000);
$ready = true;
echo "Ready!\n";
});
?>
Вивід:
Preparing...
Ready!
Condition met!
Примітки
Примітка:
suspend()— це функція. Виклик якsuspend(без дужок) є некоректним.
Примітка: У TrueAsync весь виконуваний код розглядається як корутина, тому
suspend()можна викликати будь-де (включаючи головний скрипт).
Примітка: Після виклику
suspend()виконання корутини не відновиться негайно, а коли планувальник вирішить її запустити. Порядок відновлення корутин не гарантується.
Примітка: У більшості випадків явне використання
suspend()не потрібне. Корутини автоматично призупиняються при виконанні операцій введення-виведення (читання файлів, мережеві запити тощо).
Примітка: Використання
suspend()у нескінченних циклах без операцій введення-виведення може призвести до високого навантаження на CPU. Також можна використовуватиAsync\timeout().
Журнал змін
| Версія | Опис |
|---|---|
| 1.0.0 | Додано функцію suspend() |