Comprobar el estado de la corrutina
Parte de la sección Logic & Flow del Journey de Lua de Coddy — lección 52 de 54.
A medida que trabajas con corrutinas, a menudo necesitarás saber en qué estado se encuentra una corrutina. ¿Está ejecutándose actualmente? ¿Está pausada y esperando a ser reanudada? ¿Ha terminado de ejecutarse?
Lua proporciona la función coroutine.status() para responder a estas preguntas.
La función coroutine.status() toma una corrutina como argumento y devuelve una cadena que describe su estado actual. Hay tres estados posibles:
| "suspended" | La corrutina está pausada en un yield() y puede ser reanudada |
| "running" | La corrutina se está ejecutando actualmente |
| "dead" | La corrutina ha terminado su ejecución y no puede ser reanudada de nuevo |
Así es como se usa:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended" (pausado en yield)
coroutine.resume(co)
print(coroutine.status(co)) -- "dead" (finalizado)Desafío
FácilEscribe una función checkCoroutineLifecycle que reciba resumeCount y devuelva una cadena que muestre el estado de una corrutina en diferentes puntos de su ciclo de vida.
Crea una corrutina que realice un yield una vez y luego finalice. Verifica y registra su estado después de la creación, después de la primera reanudación (cuando está pausada en el yield) y después de las reanudaciones posteriores basadas en resumeCount.
Lógica:
- Crea una función que devuelva la cadena
"paused"mediante yield una vez, y luego finalice - Envuelve esta función en una corrutina usando
coroutine.create() - Verifica el estado inmediatamente después de la creación usando
coroutine.status() - Reanuda la corrutina una vez y verifica su estado nuevamente
- Reanuda la corrutina veces adicionales basadas en
resumeCount - 1(reanudaciones totales = resumeCount) - Verifica el estado final después de todas las reanudaciones
- Devuelve una cadena con los tres estados en el formato:
initial: [status]\\nafter first resume: [status]\\nfinal: [status]
Parámetros:
resumeCount(number): Número total de veces que se debe reanudar la corrutina (mínimo 1)
Devuelve: Una cadena que muestra el estado de la corrutina en tres puntos de su ciclo de vida (string). Formato: initial: suspended\nafter first resume: suspended\nfinal: dead
Hoja de referencia
La función coroutine.status() devuelve el estado actual de una corrutina como una cadena de texto.
Estados posibles:
"suspended"- La corrutina está pausada en unyield()y puede ser reanudada"running"- La corrutina se está ejecutando actualmente"dead"- La corrutina ha terminado su ejecución y no puede ser reanudada
Uso:
coroutine.status(coroutine_object)Ejemplo:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "dead"Pruébalo tú mismo
function checkCoroutineLifecycle(resumeCount)
-- Escribe el código aquí
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas3Conceptos avanzados de funciones
Retorno de múltiples valoresFunciones variádicas (...)Funciones como valores de primera claseFunciones anónimas¿Qué es un Closure?Resumen - Manejador de eventos simple9Corrutinas para principiantes
¿Qué es una corrutina?coroutine create y resumePausar con coroutine.yield()resume y yieldComprobar el estado de la corrutinaResumen - Generador de númerosResumen - Matemática de vectores