coroutine

Mostrar obsoleto

*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>
EstadoSignificado

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 reanuda
local 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, Hola
print(coroutine.resume(repetitionCoro)) -- verdadero, HelloHello
print(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")) -- Hola
print(f()) -- Hola
print(f()) -- HelloHelloHello

Resumen

Funciones

Funciones

close

Cierra y pone la rutina proporcionada en un estado muerto. Esta función devuelve true a menos que la rutina esté en un estado de error, en cuyo caso devuelve false y el mensaje de error. Una rutina que se está ejecutando no se puede cerrar. Una rutina no se puede reanudar después de que se cierre.

Parámetros

Devuelve

true a menos que la rutina esté cerrando en un estado de error.

Variant<string, void>

El mensaje de error, si lo hay.

create

Crea una nueva coroutine, con body f. f debe ser una función Lua.

Parámetros

Devuelve

isyieldable

Devuelve true si la rutina está llamada dentro de la función de seguridad. Yielding una rutina dentro de los metamétodos o C funciones está prohibido, con la excepción de pcall y xpcall .

Devuelve

Si la coroutine puede o no puede generar con seguridad en este momento.

resume

Comienza o continúa la ejecución de la coroutine co . La primera vez que reanudas una coroutine, comienza a ejecutar su cuerpo. Los valores ... se pasan como argumentos a la función del cuerpo. Si la coroutine ha d

Parámetros

...: Variant

Devuelve

Variant<Tuple, string>

running

Devuelve la coroutine de ejecución.

Devuelve

status

Devuelve el estado de la coroutine co, como una cadena: 'ejecutando', si la coroutine está ejecutando (es decir, que llama estado); 'suspendida', si la coroutine está suspendida en un llamado para rendir, o si aún no ha comenzado a ejecutarse; 'normal' si la coroutine es activa pero no está ejecutando; y 'muerta' si la coroutine ha terminado su función del cuerpo, o si ha terminado con un error.

Parámetros

Devuelve

Crea una nueva coroutine, con body f. f debe ser una función Lua. Returniza una función que resume la coroutine cada vez que se llama. Cualquier argumento pasado a la función se comporta como los argumentos extra para resume. Returniza los mismos valores que returnan, excepto el primer valor. En caso de error, propaga el error.

Parámetros

Devuelve

yield

Tuple<Variant>

Suspende la ejecución de la coroutine de llamada. Cualquier argumento para rendir se pasa como resultados extra para reanudar. El rendimiento de una coroutine dentro de metamétodos o C funciones está prohibido, con la excepción de pcall y xpcall .

Parámetros

...: Tuple

Devuelve

Tuple<Variant>