【Lua】协同程序(coroutine)

记录学习过程

创建日期:2019-04-14

Lua协同程序(coroutine)

线程与协程的区别

线程:同一时刻多个线程可以同时执行
协程:任意时刻只有一个协同程序在运行

coroutine方法

coroutine.create()
创建一个协程,参数为一个函数

fun =function (a,b)
		print(a+b)
	end

co = coroutine.create(fun)

coroutine.resume(co,2,3)

输出

5

coroutine.resume()
作用:

  • 启动协程 ,第一个参数为co,后面的参数将作为协程里面匿名函数的参数
  • 重启协程,后面的参数将作为上一个yeild的返回值

返回值:有多个返回值,第一个返回值为是否启动成功(true或false)

  • 当启动成功时,第一个返回值为true,后面的返回值是协程中匿名函数的返回值
  • 当启动失败时,第一个返回值为false,第二个返回值返回启动失败的原因(比如,参数缺少或cannot resume dead coroutine)
co = coroutine.create(
	function (a,b)--匿名函数
		print(a+b)
		return a*b,a/b
	end
)
print(coroutine.resume(co,1,2))--true	2	0.5
print(coroutine.resume(co,1,2))--false	cannot resume dead coroutine

输出

3
true	2	0.5
false	cannot resume dead coroutine

coroutine.yield()
挂起协程,可传参数,yield的参数作为resume的返回值

co = coroutine.create(
	function (a,b)
		return coroutine.yield(a+b)
	end
)

print(coroutine.resume(co,2,3)) -- true	5

coroutine.status()
参数为co,返回协程的状态,有三种状态 dead ,suspended,running

co = coroutine.create(
	function (a,b)
		print(coroutine.status(co))--running
		coroutine.yield(a+b)
		return a-b
	end
)

print(coroutine.status(co))--suspended 

print(coroutine.resume(co,2,3)) -- true	5
print(coroutine.status(co))--suspended

print(coroutine.resume(co,2,3))--true	-1
print(coroutine.status(co))--dead

coroutine.wrap()
创建协程,使用更方便

co = coroutine.wrap(
	function (a,b)
		return a*b
	end
)

print(co(10,20))--200

coroutine.running()
返回一个正在执行的协程的线程号
比如

thread: 00ADC780

resume与yield的配合使用
第一次调用resume时,启动协程,第一个参数为co,后面的参数将作为协程里面匿名函数的参数,遇到第一个yeild时,协程被挂起,需要调用resume重启
第二次调用resume时,重启协程,第一个参数为co,后面的参数将作为上一个yeild的返回值

--定义协同程序
co = coroutine.create(
	function (a,b)--匿名函数
		print(a+b)--3
		print(coroutine.yield("yeild"))--重启
		print(a-b)---1
		return "return"
	end
)

print(coroutine.resume(co,1,2))--true	yeild
print(coroutine.resume(co,"重启"))--true	return

输出

3
true	yeild
重启
-1
true	return
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页