coroutine

Mostrar obsoleto

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

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

Resumo

Funções

Funções

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

Devolução

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

Devolução

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 .

Devolução

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

Devolução

Variant<Tuple, string>

running

Devuelve la coroutine de ejecución.

Devolução

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

Devolução

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

Devolução

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

Devolução

Tuple<Variant>