suspend
(PHP 8.6+, True Async 1.0)
suspend() — Suspende la ejecución de la corrutina actual
Descripción
suspend: void
Suspende la ejecución de la corrutina actual y cede el control al planificador. La ejecución de la corrutina se reanudará más tarde cuando el planificador decida ejecutarla.
suspend() es una función proporcionada por la extensión True Async.
Parámetros
Esta construcción no tiene parámetros.
Valores de retorno
La función no devuelve ningún valor.
Ejemplos
Ejemplo #1 Uso básico de suspend
<?php
use function Async\spawn;
spawn(function() {
echo "Antes de suspend\n";
suspend();
echo "Después de suspend\n";
});
echo "Código principal\n";
?>
Salida:
Antes de suspend
Código principal
Después de suspend
Ejemplo #2 Múltiples suspends
<?php
use function Async\spawn;
spawn(function() {
for ($i = 1; $i <= 3; $i++) {
echo "Iteración $i\n";
suspend();
}
});
echo "Corrutina iniciada\n";
?>
Salida:
Iteración 1
Corrutina iniciada
Iteración 2
Iteración 3
Ejemplo #3 Multitarea cooperativa
<?php
use function Async\spawn;
spawn(function() {
for ($i = 1; $i <= 5; $i++) {
echo "Corrutina A: $i\n";
suspend(); // Dar oportunidad a otras corrutinas de ejecutarse
}
});
spawn(function() {
for ($i = 1; $i <= 5; $i++) {
echo "Corrutina B: $i\n";
suspend();
}
});
?>
Salida:
Corrutina A: 1
Corrutina B: 1
Corrutina A: 2
Corrutina B: 2
Corrutina A: 3
Corrutina B: 3
...
Ejemplo #4 Cesión explícita de control
<?php
use function Async\spawn;
spawn(function() {
echo "Iniciando trabajo largo\n";
for ($i = 0; $i < 1000000; $i++) {
// Cálculos
if ($i % 100000 === 0) {
suspend(); // Ceder control periódicamente
}
}
echo "Trabajo completado\n";
});
spawn(function() {
echo "Otra corrutina también está trabajando\n";
});
?>
Ejemplo #5 suspend desde funciones anidadas
suspend() funciona desde cualquier profundidad de llamada — no necesita ser llamado directamente desde la corrutina:
<?php
use function Async\spawn;
function nestedSuspend() {
echo "Función anidada: antes de suspend\n";
suspend();
echo "Función anidada: después de suspend\n";
}
function deeplyNested() {
echo "Llamada profunda: inicio\n";
nestedSuspend();
echo "Llamada profunda: fin\n";
}
spawn(function() {
echo "Corrutina: antes de llamada anidada\n";
deeplyNested();
echo "Corrutina: después de llamada anidada\n";
});
spawn(function() {
echo "Otra corrutina: trabajando\n";
});
?>
Salida:
Corrutina: antes de llamada anidada
Llamada profunda: inicio
Función anidada: antes de suspend
Otra corrutina: trabajando
Función anidada: después de suspend
Llamada profunda: fin
Corrutina: después de llamada anidada
Ejemplo #6 suspend en un bucle de espera
<?php
use function Async\spawn;
$ready = false;
spawn(function() use (&$ready) {
// Esperar hasta que la bandera sea true
while (!$ready) {
suspend(); // Ceder control
}
echo "¡Condición cumplida!\n";
});
spawn(function() use (&$ready) {
echo "Preparando...\n";
Async\sleep(2000);
$ready = true;
echo "¡Listo!\n";
});
?>
Salida:
Preparando...
¡Listo!
¡Condición cumplida!
Notas
Nota:
suspend()es una función. Llamarla comosuspend(sin paréntesis) es incorrecto.
Nota: En TrueAsync, todo el código en ejecución se trata como una corrutina, por lo que
suspend()puede llamarse en cualquier lugar (incluyendo el script principal).
Nota: Después de llamar a
suspend(), la ejecución de la corrutina no se reanudará inmediatamente, sino cuando el planificador decida ejecutarla. El orden de reanudación de las corrutinas no está garantizado.
Nota: En la mayoría de los casos, no se requiere el uso explícito de
suspend(). Las corrutinas se suspenden automáticamente al realizar operaciones de E/S (lectura de archivos, solicitudes de red, etc.).
Nota: Usar
suspend()en bucles infinitos sin operaciones de E/S puede llevar a un alto uso de CPU. También puede usarAsync\timeout().
Registro de cambios
| Versión | Descripción |
|---|---|
| 1.0.0 | Se añadió la función suspend() |