协同程序:拥有自己独立的栈、局部变量和指令指针,又与其他协同程序共享全局变量和其他大部分东西。与线程有些类似,区别是:一个具有多个协同程序的程序在任意时刻只能运行一个协同程序。
coroutine.create():仅有一个参数,就是要创建的协同程序函数。通常这是一个匿名函数。
例如:
2.3 挂起协同程序,之后可以恢复它的运行
coroutine.yield():状态由运行到挂起
3.正常状态:当一个协同程序A唤醒协同程序B时,A就处于一种特殊的状态,既非挂起,也非运行,这种状态是“正常状态”。
4.resume-yield 交换数据
1.协同程序的状态:挂起、运行、死亡、正常
检查协同程序的状态:coroutine.status()
2.流程:
2.1 创建新的协同程序:coroutine.create():仅有一个参数,就是要创建的协同程序函数。通常这是一个匿名函数。
例如:
co = coroutine.create(function() print("hello") end)
print(co) -->thread: 003CB2B8
print(coroutine.status(co)) -->suspended
2.2 启动或再次启动一个协同程序执行:
coroutine.resume():状态由挂起改为运行,当程序执行完毕时,状态转为死亡coroutine.resume(co) -->hello
print(coroutine.status(co)) -->dead
2.3 挂起协同程序,之后可以恢复它的运行
coroutine.yield():状态由运行到挂起
co = coroutine.create(function()
for i = 0, 3 do
print("co",i)
-- 当遇到coroutine.resume()执行程序时才挂起,下次coroutine.resume()从此处恢复运行
coroutine.yield()
end
end)
coroutine.resume(co) -->co 0
print(coroutine.status(co))
coroutine.resume(co) -->co 1
coroutine.resume(co) -->co 2
coroutine.resume(co) -->co 3
3.正常状态:当一个协同程序A唤醒协同程序B时,A就处于一种特殊的状态,既非挂起,也非运行,这种状态是“正常状态”。
4.resume-yield 交换数据
co = coroutine.create(function(a,b) print("co",a,b) end)
coroutine.resume(co,1,2) -->co 1 2
所以传递给resume的额外参数都将视为协同程序主函数的参数
co = coroutine.create(function() print("co",coroutine.yield()) end)
coroutine.resume(co) -->第一次运行由于挂起在了print函数中,因此,print函数未执行,所以没有打印“co”
coroutine.resume(co,4,5) -->co 4 5
yield返回的额外值就是对应resume传入的参数。