Lua 学习笔记(七) —— 协同程序(一)

协同程序:拥有自己独立的栈、局部变量和指令指针,又与其他协同程序共享全局变量和其他大部分东西。与线程有些类似,区别是:一个具有多个协同程序的程序在任意时刻只能运行一个协同程序。


1.协同程序的状态:挂起、运行、死亡、正常

检查协同程序的状态:coroutine.status()


2.流程:

2.1 创建新的协同程序:
coroutine.create():仅有一个参数,就是要创建的协同程序函数。通常这是一个匿名函数。
例如:
co = coroutine.create(function() print("hello") end)
print(co) -->thread: 003CB2B8
print(coroutine.status(co)) -->suspended


2.2 启动或再次启动一个协同程序执行:

coroutine.resume():状态由挂起改为运行,当程序执行完毕时,状态转为死亡
coroutine.resume(co) -->hello
print(coroutine.status(co)) -->dead

2.3 挂起协同程序,之后可以恢复它的运行
coroutine.yield():状态由运行到挂起
co = coroutine.create(function()
	for i = 0, 3 do
		print("co",i)
-- 当遇到coroutine.resume()执行程序时才挂起,下次coroutine.resume()从此处恢复运行
	coroutine.yield()
	end
     end)

coroutine.resume(co) -->co	0
print(coroutine.status(co))
coroutine.resume(co) -->co	1
coroutine.resume(co) -->co	2
coroutine.resume(co) -->co	3

3.正常状态:当一个协同程序A唤醒协同程序B时,A就处于一种特殊的状态,既非挂起,也非运行,这种状态是“正常状态”。

4.resume-yield 交换数据
co = coroutine.create(function(a,b) print("co",a,b) end)
coroutine.resume(co,1,2) -->co	1	2

所以传递给resume的额外参数都将视为协同程序主函数的参数


co = coroutine.create(function() print("co",coroutine.yield()) end)
coroutine.resume(co) -->第一次运行由于挂起在了print函数中,因此,print函数未执行,所以没有打印“co”
coroutine.resume(co,4,5) -->co 4 5
yield返回的额外值就是对应resume传入的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值