协同程序
Lua 协同程序(coroutine)与线程(这里的线程指的是操作系统的线程)比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。
一个多线程程序可以同时运行几个线程(并发执行、抢占),而协程却需要彼此协作地运行,并非真正的多线程,即一个多协程程序在同一时间只能运行一个协程,并且正在执行的协程只会在其显式地要求挂起(suspend)时,它的执行才会暂停(无抢占、无并发)。
原文链接:https://blog.csdn.net/cooclc/article/details/112640610
协同的创建
常用方式:coroutine.create(),协程的本质是一个线程对象
print("************协同的创建************")
--常用方式
--coroutine.create()
fun = function()
print(123)
end
co = coroutine.create(fun)
--协程的本质是一个线程对象
print(co)
print(type(co))
--返回的是一个函数
--coroutine.wrap()
co2= coroutine.wrap(fun)
print(co2)
print(type(co2))
第二种方式:coroutine.wrap()返回的是一个函数
--第二种创建协程方法,返回的是一个函数
--coroutine.wrap()
co2= coroutine.wrap(fun)
print(co2)
print(type(co2))
print("************协同的运行************")
--第一种方式 对应的是通过 creat创建的协程 resume()重启coroutine和create配合使用
coroutine.resume(co)
--第二种方式 一旦调用这个函数就进入coroutine和create功能重复
co2()
协程的挂起
fun2 = function ( )
local i = 1
while true do
print(i)
i = i+1
--协程的挂起函数
coroutine.yield()
end
end
co3 = coroutine.create(fun2);
coroutine.resume(co3)
coroutine.resume(co3)
建立一个无限循环的while,和C#每帧执行不同。lua中每当执行到协程coroutine.yield()时就挂起了。直到coroutine.resume(co3)重启coroutine,执行co3中fun2的内容,循环继续执行。执行了两次,i=1,i=2
coroutine.yield(i)是可以有返回值的。返回第一个参数默认协程有没有启动成功 第二个yield里面的返回值。
print("************协同的挂起************")
fun2 = function ( )
local i = 1
while true do
print(i)
i = i+1
--协程的挂起函数
--print(coroutine.status(co3))
--print(coroutine.running())
coroutine.yield(i)--带返回值 返回第一个参数默认协程有没有启动成功 第二个yield里面的返回值
end
end
co3 = coroutine.create(fun2);
isOK,tempI = coroutine.resume(co3)
print(isOK,tempI)
可以看到输出i=1后,i=i+1,此时协程挂起。resume重新启动协程。返回true为协程启动成功。 2为i的值,也就是yeild返回值
warp()调用同理,直接调用即可。
--这种方式的协程调用也可以有返回值 只是没有默认第一个返回值了
co4 =coroutine.wrap(fun2)
print("返回值"..co4())
print("返回值"..co4())
co4()
co4()
-------------------
1
返回值2
2
返回值3
3
4
协同的状态
--coroutine.status(协程对象)
--dead 结束
--suspended 暂停
--running 进行中
分别打印co3和co的状态
print(coroutine.status(co3))
print(coroutine.status(co))
----------------
************协同的状态************
suspended
dead
可以看到一个是suspended 暂停,一个是dead 结束
首先来看co ,因为co不是一个挂起的函数,他执行完了就相当于没有了。
在来看看co3,co3中协程为挂起状态,执行完后while循环继续挂起。因此为暂停状态。
进行中running,只能在运行时得到。
在while循环中加入
得到结果
-----------------------
1
running
true 2
2
running
1
--之所以会有susoended是因为co4执行了,co3挂起了
suspended
返回值2
2
suspended
返回值3
3
suspended
4
suspended
--这个函数可以得到当前正在运行的协程的线程号
coroutine.running()
此函数也是必须在函数内部打印。可以看到前两次co3线程号是一样的,后4次co2也是一样的。
print("************协同的挂起************")
fun2 = function ( )
local i = 1
while true do
print(i)
i = i+1
--协程的挂起函数
print(coroutine.status(co3))
print(coroutine.running())
coroutine.yield(i)--带返回值 返回第一个参数默认协程有没有启动成功 第二个yield里面的返回值
end
end
---------------
************协同的挂起************
1
running
thread: 00BE83D8
true 2
2
running
thread: 00BE83D8
1
suspended
thread: 00BED2A0
返回值2
2
suspended
thread: 00BED2A0
返回值3
3
suspended
thread: 00BED2A0
4
suspended
thread: 00BED2A0