lua协程知识总结

1、协程概念

协程是非抢断式的多线程方式,看上去像多线程,其实如同名字说的协程,在协调多段程序的运行并且各自的代码段是有自己独立的变量的cache。本文主要通过实例将协程的处理讲清楚。 resumeyield是一个很好的桥梁,将代码段之间方便的传输参数。

2、协程的接口函数

函数

参数

说明

coroutine.create

f

创建协程

coroutine.resume

co [, val1, ···]

开启或者继续一个协程

coroutine.running

返回是否协程在运行,或者返回nil当被主线程调用时

coroutine.status

co

返回协程状态:running,suspended,normal,dead

coroutine.wrap

co

原生态创建协程

coroutine.yield

挂起正在执行的











3、需要注意的点

coroutine.wrap类似coroutine.create coroutine.wrap 这个函数也将创建一个 coroutine 但是它并不返回 coroutine 本身,而是返回一个函数取而代之。一旦你调用这个返回函数,就会切入coroutine 运行。所有传入这个函数的参数等同于传入 coroutine.resume 的参数。 coroutine.wrap 会返回所有应该由除第一个(错误代码的那个布尔量)之外的由coroutine.resume 返回的值。 coroutine.resume 不同, coroutine.wrap 不捕获任何错误;所有的错误都应该由调用者自己传递。

4、官方实例

  (a)
print    coroutine.yield(2*a)
 
 co = .create(function       ("co-body", a, b)
local       ("co-body", r)
local       ("co-body", r, s)
return end)
printcoroutine print("main", .resume(co, "r"))
coroutine print("main", .resume(co, "x", "y"))
5、调用时序图


6、输出结果

>lua -e "io.stdout:setvbuf 'no'" "test.lua" 
foo 2
trueco-body r
main        11  -9
main        10  
main       cannot resume dead 
7、分析过程

主线程主线程协程协程resume(co, 1, 10) 主线程挂起,唤起协程foo (1+1)coroutine.yield(2*2) 协程挂起,主线程唤醒return resume()->主线程获得2*2返回值coroutine.resume(co, "r")主线程挂起,唤起协程localr = foo(a+1)触发resume("r")参数赋值给local rcoroutine.yield(a+b, a-b)协程挂起,主线程唤醒,将会1+10,1-10print("main",coroutine.resume(co, "r"))yield的参数输出coroutine.resume(co, "x", "y")主线程挂起,唤起协程localr, s = coroutine.yield(a+b, a-b)主线程中输入的"x","y"变量将会被赋值给r,s由于协程已经执行全部的流程最终将会把流程交回给主线程,协程将会变成deadprint("main", coroutine.resume(co, "x","y"))将会触发协程函数返回值的打印X,协程已经不再工作状态,所以造成程序直接返回,服务器不能唤起。

看完这个例子之后,其实可以看出来这两个线程其实一直在配合做事情。当resume被调用的时候,主线程就暂停了活动,将运行的权限交给了coroutine来做事。当coroutine yield的时候,将会直接触发自己的coroutine暂停,激活主线程的resumereturn,接着做事。所以理论上对一个coroutine的调用,函数中有几个yield,主线程的代码中需要些多少个resume函数,否则如果主线程只对coroutine做一次resume。但是这个也不会造成太多的内存问题,协程对象被释放掉之后也将不会存在内存泄露。







  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值