Las corutinas son una característica poderosa y flexible de Lua que permite la creación de funciones que pueden suspender su ejecución y luego reanudarla. Esto es útil para tareas como la programación concurrente, la simulación de procesos y la creación de generadores.

Conceptos Clave

  1. Corutina: Una corutina es una función que puede suspender su ejecución (con coroutine.yield) y luego reanudarla (con coroutine.resume).
  2. Estados de una Corutina: Las corutinas pueden estar en uno de los siguientes estados:
    • Suspended: La corutina está lista para ser ejecutada.
    • Running: La corutina está actualmente en ejecución.
    • Dead: La corutina ha terminado su ejecución.

Creación y Uso de Corutinas

Creación de una Corutina

Para crear una corutina, utilizamos coroutine.create, que toma una función como argumento y devuelve una corutina.

function myCoroutine()
    print("Corutina iniciada")
    coroutine.yield()  -- Suspende la ejecución
    print("Corutina reanudada")
end

co = coroutine.create(myCoroutine)

Ejecución de una Corutina

Para iniciar o reanudar una corutina, utilizamos coroutine.resume.

coroutine.resume(co)  -- Salida: Corutina iniciada
coroutine.resume(co)  -- Salida: Corutina reanudada

Ejemplo Completo

function exampleCoroutine()
    for i = 1, 3 do
        print("Corutina en paso " .. i)
        coroutine.yield()
    end
end

co = coroutine.create(exampleCoroutine)

print(coroutine.status(co))  -- Salida: suspended
coroutine.resume(co)  -- Salida: Corutina en paso 1
print(coroutine.status(co))  -- Salida: suspended
coroutine.resume(co)  -- Salida: Corutina en paso 2
coroutine.resume(co)  -- Salida: Corutina en paso 3
print(coroutine.status(co))  -- Salida: dead

Funciones de Corutinas

coroutine.create

Crea una nueva corutina.

co = coroutine.create(function() print("Hola, corutina!") end)

coroutine.resume

Reanuda la ejecución de una corutina.

coroutine.resume(co)

coroutine.yield

Suspende la ejecución de la corutina.

coroutine.yield()

coroutine.status

Devuelve el estado de una corutina.

print(coroutine.status(co))  -- Salida: suspended, running, o dead

coroutine.wrap

Crea una corutina y devuelve una función que, cuando se llama, reanuda la corutina.

co = coroutine.wrap(function()
    for i = 1, 3 do
        print("Paso " .. i)
        coroutine.yield()
    end
end)

co()  -- Salida: Paso 1
co()  -- Salida: Paso 2
co()  -- Salida: Paso 3

Ejercicio Práctico

Ejercicio 1: Contador con Corutinas

Crea una corutina que actúe como un contador. La corutina debe contar de 1 a 5, suspendiendo su ejecución después de cada número.

Solución

function contador()
    for i = 1, 5 do
        print("Contador: " .. i)
        coroutine.yield()
    end
end

co = coroutine.create(contador)

for i = 1, 5 do
    coroutine.resume(co)
end

Ejercicio 2: Generador de Números Pares

Crea una corutina que genere números pares desde 2 hasta 10.

Solución

function generadorPares()
    for i = 2, 10, 2 do
        print("Número par: " .. i)
        coroutine.yield()
    end
end

co = coroutine.create(generadorPares)

for i = 1, 5 do
    coroutine.resume(co)
end

Resumen

En esta sección, hemos aprendido sobre las corutinas en Lua, una herramienta poderosa para manejar la ejecución de funciones de manera controlada. Hemos visto cómo crear, ejecutar y suspender corutinas, así como algunas funciones útiles relacionadas con ellas. Los ejercicios prácticos proporcionados te ayudarán a consolidar estos conceptos y a aplicarlos en situaciones reales. En el próximo tema, exploraremos la Programación Orientada a Objetos en Lua.

© Copyright 2024. Todos los derechos reservados