coroutine
*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.
Una coroutine se utiliza para realizar múltiples tareas al mismo tiempo desde dentro del mismo script. Estas tareas pueden incluir la producción de valores de los入力 o el rendimiento de un trabajo en un subroutine cuando se soluciona un problema más grande. Una tarea no necesita incluso tener un punto de finalización definido, pero necesita definir un tiempo específico en el que produzca (pausa) para dejar que otras cosas se puedan trabajar.
Usando Coroutines
Una nueva coroutine se puede crear proporcionando una función a coroutine.create() . Una vez creada, una coroutine no comienza a ejecutarse hasta que se llama la primera vez
local function task(...)
-- Esta función puede hacer algo de trabajo para un poco y luego producir algo de valor
coroutine.yield("first") -- Ser devueltos por coroutine.resume()
-- La función continúa una vez que se reanuda
return "second"
end
local taskCoro = coroutine.create(task)
-- Llamar resume por primera vez, que ejecuta la función desde el principio
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> cierto, primero (tarea llamada coroutine.yield()}
-- Continúa ejecutando la función hasta que se acabe o se detenga
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Durante el tiempo de vida de la coroutine, puede llamar coroutine.status() para inspeccionar su estado:
<tbody><tr><td><b>suspendido</b></td> <td>La coroutine está esperando para ser reanudada. Las corutinas comienzan en este estado y entran cuando su función llama <code>coroutine.yield()</code> .</td></tr><tr><td><b>ejecutando</b></td><td>La coroutine está siendo ejecutada ahora mismo.</td></tr><tr><td><b>normal</b></td> <td>La coroutine está esperando el rendimiento de otra coroutine; en otras palabras, ha reanudado otra coroutine.</td></tr><tr><td><b>muerto</b></td> <td>La función ha terminado (se ha devuelto o ha lanzado un error). La coroutine no se puede usar más.</td></tr></tbody>
Estado | Significado |
---|
Envoltura de Coroutines
Al trabajar con corutinas, también puede renunciar al uso del objeto coroutine y en su lugar usar una función de envoltura. Tal función de envoltura reanudará una coroutine particular cuando se llame y solo devolverá los valores obtenidos. Puede hacer esto usando coroutine.wrap() :
-- Cree una rutina y devuelva una función de envoltura que la reanudalocal f = coroutine.wrap(task)-- Resume la coroutinea como si llamáramos coroutinea.resume()local result = f()-- Si ocurre un error, ¡se elevará aquí!-- This differs from coroutine.resume() which acts similar to pcall()
El primer valor devuelto de coroutine.resume() describe si se ha ejecutado una coroutine sin errores. Sin embargo, las funciones devueltas por coroutine.wrap() no lo harán: en cambio, devuelven directamente los valores devueltos o pasados a coroutine.yield(), si es que se ha producido un error mientras se ejecuta la función de coroutine
Ejemplo de patrón de productor
Imagine una tarea que produce repeticiones de una palabra: cada vez que produce una repetición, la siguiente producirá una más. Por ejemplo, proporcionar Hello producirá Hello , HelloHello , 1> HelloHello1> , etc. Para hacer esto, puede definir 4> peatEsto4> :
-- Esta función repite una palabra cada vez que se reanuda su rutina
local function repeatThis(word)
local repetition = ""
while true do
-- Haz una repetición y luego obtén el resultado
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Para ejecutar esta función como coroutine, puede usar coroutine.create() seguido por múltiples llamadas a coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- verdadero, Holaprint(coroutine.resume(repetitionCoro)) -- verdadero, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Para esta función de productor, también puede usar coroutine.wrap() para obtener una función que produce valores:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Holaprint(f()) -- Holaprint(f()) -- HelloHelloHello