Lua协程(coroutine)的基本知识

有一个概念叫做coroutine, 也就是协程。

协程究竟是什么呢,

正式一点的说法: wiki : 协程是一种程序组件,是由子例程(过程、函数、例程、方法、子程序)的概念泛化而来的,
子例程只有一个入口点且只返回一次,而协程允许多个入口点,可以在指定位置挂起和恢复执行。
Marlin: 协程的本地数据在后续调用中始终保持。
协程在控制离开时暂停执行,当控制再次进入时只能从离开的位置继续执行

通俗一点的理解: 协程在执行时,可以被挂起。在某个时间点被唤醒继续执行,其上下文保持不变。

我们简单看一个例子:

local co = coroutine.create(function()
    for i = 2016, 2017 do
        print(i)
        coroutine.yield()
    end
end)

for k = 1, 2 do
    coroutine.resume(co)
end

输出:
2016
2017

解释一下:

coroutine.create
creat函数创建一个新的coroutine,定义了协程内的任务。可以看成是coroutine类创建了一个对象co

coroutine.resume
第一次调用, 从coroutine对象主函数第一行开始执行,到函数结束或者下一个yield函数停止。
之后的调用,从上次yield函数处开始, 运行到自身终止或者是coroutine的下一个yield函数。

coroutine.yield
挂起当前的执行的coroutine实例。

所以上面的程序运行的过程是这样的:
coroutine.create创建一个叫co的实例。
在for循环里, 第一次coroutine.resume(co),
执行了 i = 2016, print(i) coroutine.yield(),
第二次 coroutine.resume(co),
执行了 1 = 2017, print(i) coroutine.yield(),

所以如果协程里的方法改成

function()
    for i = 2016, 2017 do
        print(i)
        coroutine.yield()
        print(i)
    end
end
输出将为:
2016
2016
2017

Lua协程是非对称的,因为程序控制权经由传递了。
lua的resume-yield可以互相交换数据。
最典型的Lua协程示例是生产者-消费者问题。
其他深入的用法以后再整理。


如有错误,欢迎指出。
可以在下方留言, 或加我QQ:812123870,
或者发邮件:[email protected]

你可能感兴趣的:(Lua)