Lua协程分析第一篇

线程和协同程序的简单介绍

1、首先复习一下多线程。线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程是由cup调度, 当cpu处理不过来时,线程会按照某种方式等待执行,也就是说,线程是操作系统隐藏执行的,并非用户显示的控制线程的执行先后次序。当多核cpu时,线程实现了并发执行。
  
2、协同程序,其实也可以理解为一个 “线程”,只不过这个“线程”是用户自己决定怎么调用的,用户可以决定调用的先后次序、是否暂停该“线程”,“线程”的创建还有运行还有暂停还有销毁都是用户自己定义,相当于给了用户修改操作系统的线程调度权限一样。协同程序本身不是并发执行的,哪怕是多核cpu。要实现协同程序的“并发”,需要同时启动多个协程。

所以,可以简单总结为,线程是操作系统调用的,协程是用户自己调用的,协程是在线程中实现,是在线程中另外开辟了一个并发小流程,线程不能用户自己暂停,但协程可以用户暂停。协程不会导致线程崩溃,这是协程的特点决定的,因为协程的主函数出错,协程就退出了执行,并且返回相应的错误信息。

Lua协同程序的创建、运行、挂起 。

1、Lua协程的创建使用 handle_co = corountine.create(mainfun),输入参数是主函数地址,返回参数是对应主函数的协程句柄。
2、使用coroutine.yield()挂起运行中的主函数,此时的协程状态是 suspend。
3、使用coroutine.status(handle_co ) 查看指定协程的状态:suspended(挂起)、dead(死忙)、running(运行)。
4、使用 coroutine.resume(handle_co)唤醒指定协程,此时的协程状态是 running。
5、主函数执行结束之后,协程死忙,此时的状态是 dead。

下面的HelloWorld函数是协程的主函数。

function HelloWorld(msg)
  print('HelloWorld msg=',msg)
  for i = 1 , 3 do
      local resumemsg = coroutine.yield()  --协程挂起函数需要在主函数里面
      print('resumemsg =',resumemsg)
  end
end

coFunc= coroutine.create(HelloWorld) --给主函数创建携程

print(coroutine.status(coFunc)) --创建协程之后,协程是挂起状态

coroutine.resume(coFunc,"我是主函数的参数") --第一次启动携程的参数是函数参数

coroutine.resume(coFunc,'第1次是coroutine.yield()的返回参数') --第二次调用的参数是coroutine.yield()的返回值

coroutine.resume(coFunc,'第2次还是coroutine.yield()的返回参数') --第三次调用的参数是coroutine.yield()的返回值

coroutine.resume(coFunc,'第3次还是coroutine.yield()的返回参数')  --第四次调用的参数是coroutine.yield()的返回值

print(coroutine.status(coFunc)) -- 此时主函数已经执行完毕,协程已经死忙

coroutine.resume(coFunc,'第4次还是coroutine.yield()的返回参数') --此时协程已经死忙,不会再执行

--[[ 输出:
suspended
HelloWorld msg=	我是主函数的参数
resumemsg =	第1次是coroutine.yield()的返回参数
resumemsg =	第2次还是coroutine.yield()的返回参数
resumemsg =	第3次还是coroutine.yield()的返回参数
dead
]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值