Construcción de un bucle de eventos sencillo
Implemente un planificador de coroutines con una cola de ejecución y un bucle de reanudación.
Construcción de un bucle de eventos sencillo es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué es un bucle de eventos?
Un bucle de eventos ejecuta un planificador que reanuda las corrutinas cuando los eventos que esperan están listos. Esto permite ejecutar varias tareas de forma concurrente sin utilizar hilos del sistema operativo.
La cola de ejecución
Comience con una cola de corrutinas listas. En cada tick, procese todas las corrutinas listas, una por una.
local queue = {}
local function spawn(fn)
queue[#queue+1] = coroutine.create(fn)
endEl tick del bucle
En cada tick se extrae y reanuda cada corrutina lista. Las corrutinas que ceden la ejecución quedan pausadas hasta que vuelven a añadirse a la cola.
local function runLoop()
while #queue > 0 do
local current = queue
queue = {}
for _, co in ipairs(current) do
local ok, err = coroutine.resume(co)
if not ok then print("Error:", err) end
if coroutine.status(co) ~= "dead" then
queue[#queue+1] = co -- re-queue if still alive
end
end
end
endCeder para pausar
Una corrutina cede la ejecución cuando necesita esperar. El planificador la reanuda en el siguiente tick.
spawn(function()
print("Task A: step 1")
coroutine.yield() -- pause
print("Task A: step 2")
end)
spawn(function()
print("Task B: only step")
end)
runLoop()Retrasos simulados
Implemente una espera registrando cuándo debe reanudarse una corrutina.
local timers = {}
local function sleep(seconds)
local wakeAt = os.clock() + seconds
timers[coroutine.running()] = wakeAt
coroutine.yield()
endBucle con temporizadores
En cada tick, compruebe los temporizadores y vuelva a poner en la cola las corrutinas cuyo momento de reanudación ya haya llegado.
local function timedLoop()
while #queue > 0 or next(timers) do
local now = os.clock()
for co, wakeAt in pairs(timers) do
if now >= wakeAt then
timers[co] = nil
queue[#queue+1] = co
end
end
-- process queue...
end
endIntegración de E/S
Integre un mecanismo de select/poll: haga que cedan las corrutinas que esperan E/S y reanúdelas cuando su descriptor de archivo esté listo.
Aislamiento de errores
Envuelva cada reanudación de una corrutina en pcall o compruebe el valor de retorno ok. Una corrutina que falle no debe detener todo el bucle.
Planificación cooperativa
Las tareas deben ceder la ejecución voluntariamente. Una corrutina que se ejecute indefinidamente sin ceder impedirá que se ejecuten las demás. Utilice debug.sethook con un contador de pasos como protección contra el desalojo de código no confiable.
Prioridades de las tareas
Implemente varias colas (de prioridad alta, normal y baja) y vacíe primero las colas de mayor prioridad en cada tick.
Alternativas del mundo real
Bucle de eventos para producción: luv (enlaces de libuv), copas (basado en sockets) y OpenResty (nginx + cosockets). Implemente uno propio únicamente con fines didácticos o para usos integrados.
Pregunta sobre el bucle de eventos
¿Por qué deben ceder voluntariamente las corrutinas de un bucle de eventos cooperativo?
Repaso: bucle de eventos simple
Un bucle de eventos utiliza una cola de ejecución de corrutinas. En cada tick, reanuda las corrutinas listas. Las tareas ceden para pausarse y vuelven a ponerse en la cola cuando se cumple su condición. Esto permite gestionar E/S y temporizadores concurrentes en Lua con un solo hilo.
Preguntas frecuentes
¿La lección «Construcción de un bucle de eventos sencillo» es gratis?
Sí — el texto completo de «Construcción de un bucle de eventos sencillo» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Construcción de un bucle de eventos sencillo»?
Implemente un planificador de coroutines con una cola de ejecución y un bucle de reanudación. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Construcción de un bucle de eventos sencillo»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Construcción de un bucle de eventos sencillo
- Async/await con coroutines
- Patrones similares a Promise
- E/S no bloqueante con luasocket