coroutine
--[[
协同程序 coroutine
方法 描述
1. 定义协同函数
coroutine.create() 创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
2. 启动协同函数
coroutine.resume() 重启 coroutine,和 create 配合使用
3 暂停(挂起)协同函数
coroutine.yield() 挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果
coroutine.status() 查看 coroutine 的状态
注:coroutine 的状态有三种:dead,suspended,running,具体什么时候有这样的状态请参考下面的程序
coroutine.wrap() 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复
coroutine.running() 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号
--]]
--定义协同函数
--协同函数启动
ca = coroutine.create(
function (a,b)
print(a+b)
end)
--继续 and 暂停 如果不暂停要等到函数执行完了才往下执行
coroutine.resume(ca,20,30) --启动那个协同函数,协同函数的参数(20,30)
--第二种协同函数启动方式,区别是直接启动
cb = coroutine.wrap(
function (a,b)
print(a+b)
end)
--启动协同函数
cb(1,2) --输出3
cc = coroutine.create(
function (a,b)
print(a+b) -- 输出 15
coroutine.yield() --暂停
print(a-b) -- 暂停了 没有执行
end)
--继续 and 暂停
coroutine.resume(cc,9,6)
print("测试") -- 输出 测试
--重新调用 执行剩下的print(a-b)
coroutine.resume(cc,9,6) --输出 3
-- 执行完的协同程序 不会再次启动
coroutine.resume(cc,9,6) --没有输出
-- 执行完的协同程序 不会再次启动
coroutine.resume(cc,8,6) --没有输出
--协同函数返回值
cd = coroutine.create(
function (a,b)
print(a+b) -- 输出 15
coroutine.yield() --暂停
print(a-b) -- 暂停了 没有执行
return a*b
end)
--返回值只有true or false 表示十分启动成功
x = coroutine.resume(cd,9,6)
print(x) -- 输出true
-- 第二索引开始的才是返回值
x,y =coroutine.resume(cd,9,6)
print(x,y) --输出 true 54
--协同函数 状态
ce = coroutine.create(
function (a,b)
print(a+b)
end)
--启动协同函数
--coroutine.status 只能看coroutine.create形式创建的状态
print(coroutine.status(ce)) --输出 suspended
cf = coroutine.create(
function (a,b)
print(coroutine.status(cf)) -- 只有在协同函数中参数运行状态
print(a+b)
print(coroutine.running()) -- 返回正在运行的线程号
print(coroutine.status(cf))
end)
--没有启动时
print(coroutine.status(cf)) --输出 suspended
--启动协同函数
coroutine.resume(cf,12,6) --输出 running 18 thread: 0023EF10 running
--运行完成后
print(coroutine.status(cf)) --输出 dead
print(coroutine.running())
--普通函数 return coroutine.yield暂停
--yield的返回值就是传递过去的值
function foo (a)
print("foo 函数输出", a)
return coroutine.yield(2 * a) -- 返回 2*a 的值
end
--实例
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("--分割线----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---分割线---")
--[[
以上实例执行输出结果为:
第一次协同程序执行输出 1 10
foo 函数输出 2
main true 4
--分割线----
第二次协同程序执行输出 r
main true 11 -9
---分割线---
第三次协同程序执行输出 x y
main true 10 结束协同程序
---分割线---
main false cannot resume dead coroutine
---分割线---
--]]