(Notas de Lua): Coroutine de Lua

 

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    ...

Supongo que te gusta

Origin blog.csdn.net/baidu_41388533/article/details/108512181
Recomendado
Clasificación