Lua 协同程序coroutine解析

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
---分割线---
--]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值