Lua-协调程序-7

协同程序

Lua 协同程序(coroutine)与线程(这里的线程指的是操作系统的线程)比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

一个多线程程序可以同时运行几个线程(并发执行、抢占),而协程却需要彼此协作地运行,并非真正的多线程,即一个多协程程序在同一时间只能运行一个协程,并且正在执行的协程只会在其显式地要求挂起(suspend)时,它的执行才会暂停(无抢占、无并发)。

原文链接:https://blog.csdn.net/cooclc/article/details/112640610

协同的创建

常用方式:coroutine.create(),协程的本质是一个线程对象

print("************协同的创建************")
--常用方式
--coroutine.create()
fun = function()
	print(123)
end

co = coroutine.create(fun)	
--协程的本质是一个线程对象
print(co)
print(type(co))

--返回的是一个函数
--coroutine.wrap()
co2= coroutine.wrap(fun)
print(co2)
print(type(co2))

 第二种方式:coroutine.wrap()返回的是一个函数

--第二种创建协程方法,返回的是一个函数
--coroutine.wrap()
co2= coroutine.wrap(fun)
print(co2)
print(type(co2))

print("************协同的运行************")
--第一种方式 对应的是通过 creat创建的协程 resume()重启coroutine和create配合使用
coroutine.resume(co)

--第二种方式 一旦调用这个函数就进入coroutine和create功能重复
co2()

 协程的挂起

fun2 = function (  )
	local i = 1 
	while true do
		print(i)
		i = i+1
		--协程的挂起函数
		coroutine.yield()
	end	
end

co3 = coroutine.create(fun2);
coroutine.resume(co3)
coroutine.resume(co3)

建立一个无限循环的while,和C#每帧执行不同。lua中每当执行到协程coroutine.yield()时就挂起了。直到coroutine.resume(co3)重启coroutine,执行co3中fun2的内容,循环继续执行。执行了两次,i=1,i=2

coroutine.yield(i)是可以有返回值的。返回第一个参数默认协程有没有启动成功 第二个yield里面的返回值。

print("************协同的挂起************")
fun2 = function (  )
	local i = 1 
	while true do
		print(i)
		i = i+1
		--协程的挂起函数
		--print(coroutine.status(co3))
		--print(coroutine.running())
		coroutine.yield(i)--带返回值 返回第一个参数默认协程有没有启动成功 第二个yield里面的返回值
	end	
end

co3 = coroutine.create(fun2);
isOK,tempI = coroutine.resume(co3)
print(isOK,tempI)

 可以看到输出i=1后,i=i+1,此时协程挂起。resume重新启动协程。返回true为协程启动成功。 2为i的值,也就是yeild返回值

 warp()调用同理,直接调用即可。

--这种方式的协程调用也可以有返回值 只是没有默认第一个返回值了
co4 =coroutine.wrap(fun2)
print("返回值"..co4())
print("返回值"..co4())
co4()
co4()

-------------------
1
返回值2
2
返回值3
3
4

协同的状态

--coroutine.status(协程对象)
--dead 结束
--suspended 暂停
--running 进行中

分别打印co3和co的状态

print(coroutine.status(co3))
print(coroutine.status(co))

----------------
************协同的状态************
suspended
dead

可以看到一个是suspended 暂停,一个是dead 结束

首先来看co ,因为co不是一个挂起的函数,他执行完了就相当于没有了。

在来看看co3,co3中协程为挂起状态,执行完后while循环继续挂起。因此为暂停状态。

 进行中running,只能在运行时得到。

在while循环中加入

 得到结果

-----------------------
1
running
true	2
2
running
1
--之所以会有susoended是因为co4执行了,co3挂起了
suspended 
返回值2
2
suspended
返回值3
3
suspended
4
suspended

--这个函数可以得到当前正在运行的协程的线程号
coroutine.running()

此函数也是必须在函数内部打印。可以看到前两次co3线程号是一样的,后4次co2也是一样的。

print("************协同的挂起************")
fun2 = function (  )
	local i = 1 
	while true do
		print(i)
		i = i+1
		--协程的挂起函数
		print(coroutine.status(co3))
		print(coroutine.running())
		coroutine.yield(i)--带返回值 返回第一个参数默认协程有没有启动成功 第二个yield里面的返回值
	end	
end
---------------
************协同的挂起************
1
running
thread: 00BE83D8
true	2
2
running
thread: 00BE83D8
1
suspended
thread: 00BED2A0
返回值2
2
suspended
thread: 00BED2A0
返回值3
3
suspended
thread: 00BED2A0
4
suspended
thread: 00BED2A0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 本套课程分为基础与中级两部分,分别就lua语言的各方面知识点进行探讨,学习完本套课程,对于后续Xlua(Tolua等框架)技术的学习提供强大的语言技术保证。       本套lua课程采用入门与商业级两种开发IDE进行教学:入门级的SciTE内置IDE与商业级的IDEA lua插件。本套课程学习完毕,对于除了传统手游外,在VR、AR、商业级大型应用程序、嵌入式设备开发等领域都有较强的指导作用。           《lua中级篇》分为:“函数的进阶”、“字符串进阶”、“Table进阶”、“元表”、“OOP面向对象”、“协同程序”、“IO操作”、“调试与运行”等八个大的章节,详细深入讲解lua开发的方方面面。        内容包含lua可变参数、闭包、模块、函数尾调用、字符串模式匹配、字符串不变性原理、矩阵、链表、元表详解与应用、协同的生命周期与生产消费者问题、lua文件各种读写操作、lua执行外部代码与错误异常处理垃圾收集机制等。       最后,lua中级篇的学习,对于广大学员开发商业级lua热更新技术,具有不可替代的重要作用! 热更新系列(技术含量:中高级):B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值