线程和协同程序的简单介绍
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
]]