0Pricing
Lua Academy · Lección

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)
end

El 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
end

Ceder 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()
end

Bucle 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
end

Integració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

  1. Construcción de un bucle de eventos sencillo
  2. Async/await con coroutines
  3. Patrones similares a Promise
  4. E/S no bloqueante con luasocket
← Volver a Lua Academy