什么是协同(coroutine)?
协程是针对函数来说的,本来是一个普通的函数,我们只是让这个函数有协程的功能,可以理解为一个协程函数
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。
协同是非常强大的功能,但是用起来也很复杂。
线程和协同程序区别
线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。
在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。
协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同
--第一种
--创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用
coroutine1 = coroutine.create(
function(a,b)
print(a+b);
--在普通方法中暂停需要return
coroutine.yield();--将函数暂停(暂停的函数中返回值在yield中传递)
print(a-b);
return a*b;
end
)
--重启coroutine,和create配合使用
coroutine.resume(coroutine1,20,30);
--第二种(没有暂停的功能)
coroutine2 = coroutine.wrap(
function(a,b)
print(a+b);
end
)
coroutine2(30,40);
--查看coroutine的状态
--注:coroutine的状态有三种:dead,suspend,running,具体什么时候有这样的状态请参考下面的程序
print(coroutine.status(coroutine1))
coroutine.resume(coroutine1);--继续的时候函数可以不用传递
--协程有返回值的,第一个返回的时候启动成功,后面参数为需要返回的值
print(coroutine.status(coroutine1))
--返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号
coroutine.running();
注::
第一个yield的参数作为第一个resume的返回值
第一个resume的参数作为协程的参数
第二个resume的参数作为第一个yield的返回值
resume和yield的配合强大之处在于,resume处于主程中,它将外部状态(数据)传入到协同程序内部;而yield则将内部的状态(数据)返回到主程中。