Lua corrutina
Primeros pasos Caso 1
- Crea e inicia la corrutina
- Defina la función coroutine coroutine.create ()
- Inicie el coroutine.resume ()
co=coroutine.create( --创建协程函数 function (a,b) print(a+b) end ) coroutine.resume(co,20,30) --启动协程函数
Primeros pasos caso 2
- Cree una corrutina a través de coroutine.wrap () e iníciela
co=coroutine.wrap( function (a,b) print(a+b) end ) co(20,30)
Primeros pasos caso 3
- Use coroutine.yield () para suspender la coroutine a la mitad y comience de nuevo, la segunda vez que coroutine.resume () no necesita pasar parámetros
co=coroutine.create( function (a,b) print(a+b) coroutine.yield() print(a-b) end ) coroutine.resume(co,1,2) print("I'm here!") coroutine.resume(co) 输出: 3 I'm here! -1
Primeros pasos Caso 4
- coroutine.status ()
- Hay tres estados de corrutina: muerto, suspendido, en ejecución
co=coroutine.create( function (a,b) print(a+b) print(coroutine.status(co)) --running print(a+b) coroutine.yield() print(a-b) end ) print(coroutine.status(co)) --此时未启动协程,suspended coroutine.resume(co,10,20) print(coroutine.status(co)) --suspended print("I'm here!") coroutine.resume(co) print(coroutine.status(co)) --dead
Primeros pasos Caso 5
- coroutine.running ()
- Devuelve la corrutina en ejecución. Una corrutina es un hilo. Cuando se usa en ejecución, devuelve un número de hilo de enrutamiento.
co=coroutine.create( function (a,b) print( coroutine.running() ) --thread: 00A78110 coroutine.yield() print(a-b) end ) print( coroutine.running() ) --nil coroutine.resume(co,10,40) print("I'm here!") coroutine.resume(co)
Primeros pasos 6
- La corrutina puede devolver varios valores. El primer valor es un valor booleano, que indica si la corrutina se inició correctamente, y el valor de retorno de la función de corrutina es el siguiente
co=coroutine.create( function (a,b) coroutine.yield(a*b,a/b) return a%b,a/b+1 end ) res1,res2,res3 = coroutine.resume(co,10,40) print(res1,res2,res3) --true 400 0.25 print("I'm here!") res1,res2,res3 = coroutine.resume(co) print(res1,res2,res3) --true 10 1.25
para resumir
método descripción coroutine.create () Crear corrutina, devolver corrutina, el parámetro es una función, cuando se usa junto con resume, se despierta la llamada a la función coroutine.resume () Reinicie coroutine y utilícelo con create coroutine.yield () Suspender la rutina, configurar la rutina en estado suspendido, esto puede tener muchos efectos útiles junto con la reanudación coroutine.status () Ver el estado de la corrutina
Nota: Hay tres estados de la corrutina: muerta, suspendida y en ejecución. Consulte el siguiente programa para obtener información específica sobre cuándo existe tal estado.coroutine.wrap () Cree una corrutina y devuelva una función. Una vez que llame a esta función, ingrese la corrutina y repita la función de creación coroutine.running () Devuelve la corrutina en ejecución. Una corrutina es un hilo. Cuando se usa en ejecución, devuelve un número de hilo de enrutamiento.
- Coroutine se implementa como un hilo en la parte inferior.
- Cuando se crea una corrutina, se registra un evento en el nuevo hilo.
- Cuando se utiliza el evento de activación de reanudación, se ejecuta la función de corrutina de create. Cuando se encuentra el rendimiento, el hilo actual se suspende, esperando el evento de activación de reanudación nuevamente.
Caso completo
function foo (a) print("foo 函数输出", a) return coroutine.yield(2 * a) -- 返回 2*a 的值 end co = coroutine.create(function (a , b) print("第一次协同程序执行输出", a, b) -- co-body 1 10 local r = foo(a + 1) print("第二次协同程序执行输出", r) local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入 print("第三次协同程序执行输出", r, s) return b, "结束协同程序" -- b的值为第二次调用协同程序时传入 end) print("main", coroutine.resume(co, 1, 10)) -- true, 4 print("main", coroutine.resume(co, "r")) -- true 11 -9 print("main", coroutine.resume(co, "x", "y")) -- true 10 end print("main", coroutine.resume(co, "x", "y")) -- false cannot resume dead coroutine
- El ejemplo anterior continúa de la siguiente manera:
- Llame a resume para reactivar el programa cooperativo La operación de resume devuelve verdadero si tiene éxito, de lo contrario devuelve falso;
- Operación del programa cooperativo;
- Ejecute la declaración de rendimiento;
- Yield suspende el programa colaborativo y el primer currículum regresa; (nota: aquí el rendimiento devuelve y el parámetro es el parámetro de currículum)
- La segunda vez que se reanude, vuelva a activar el programa cooperativo (nota: en los parámetros de reanudación, excepto el primer parámetro, los parámetros restantes se utilizarán como parámetros de rendimiento) rendimiento de retorno;
- El programa cooperativo continúa funcionando;
- Si el coprograma utilizado continúa ejecutándose y continúa llamando al método de reanudación después de la finalización, la salida: no se puede reanudar la rutina muerta
- La poderosa combinación de curriculum vitae y rendimiento es que curriculum vitae está en el proceso principal y transfiere el estado externo (datos) a la parte interna del programa colaborativo, mientras que rendimiento devuelve el estado interno (datos) al proceso principal.
Problema productor-consumidor
local newProductor function productor() local i = 0 while true do i = i + 1 send(i) -- 将生产的物品发送给消费者 end end function consumer() while true do local i = receive() -- 从生产者那里得到物品 print(i) end end function receive() local status, value = coroutine.resume(newProductor) return value end function send(x) coroutine.yield(x) -- x表示需要发送的值,值返回以后,就挂起该协同程序 end -- 启动程序 newProductor = coroutine.create(productor) consumer() 输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- [Nota]: consulte https://www.runoob.com/lua
(Notas de Lua): Coroutine de Lua
Supongo que te gusta
Origin blog.csdn.net/baidu_41388533/article/details/108512181
Recomendado
Clasificación