您的位置:首页 > 编程语言 > Lua

Lua五:协程

2021-10-05 18:29 696 查看

       Lua的协程很像系统中的线程,也是一个独立的执行线。不同之处是,线程是并行执行的,而协程是协作式的,即同一时刻只有一个协程在执行,并且只有它自己显式请求挂起时,执行权才会转换。协程是一系列的可执行语句,拥有自己的栈、局部变量和指令指针,同时协程又与其他协程共享了全局变量和其他几乎一切资源。Lua语言提供的是所谓的非对称协程(asymmetric coroutine), 也就是说需要两个函数来控制协程的执行,一个用于挂起协程的执行,另一个用于恢复协程的执行。而其他一些语言提供的是对称协程( symmetric .coroutine),只提供一个函数用于在一个协程和另一个协程之间切换控制权。

       一个协程有以下四种状态,即挂起(suspended)、 运行(running)、 正常(normal) 和死亡(dead)。

       Lua语言中协程相关的所有函数都被放在表coroutine中。

      1、函数create用于创建新协程,该函数只有一一个参数,即协程要执行的代码的函数(协程体(body))。 函数create返回一个「thread」类型的值,即新协程。通常,函数create的参数是一一个匿名函数,例如:

co = coroutine. create(function () print("hi") end)

print(type(co))        --> thread

2、我们可以通过函数corout ine. status来检查协程的状态:

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

       3、当一个协程被创建时,它处于挂起状态,即协程不会在被创建时自动运行。函数coroutine. resume用于启动或再次启动一个协程的执行,并将其状态由挂起改为运行:

coroutine. resume(co)   --> hi

在上例中,协程体只是简单地打印了「hi」后便终止了,然后协程就变成了死亡状态:

print( coroutine. status(co))     --> dead

       当匿名函数需要参数时,参数依次填入resume括号中,如:

co = coroutine. create(function (a, b,c)

print("co",a, b, c + 2)

end)

coroutine.resume(co,1, 2, 3)   -->co 1 2 5

        4、coroutine.yield (···)使正在执行的函数挂起。Lua语言中一个非常有用的机制是通过一对resume -yield来交换数据。在函数coroutine. resume的返回值中,第一个返回值为true 时表示没有错误,之后的返回值对应函数yield 的参数。与之对应的是,函数coroutine. yield的返回值是对应的resume 的参数。

co = coroutine. create(

function (a,b)

local c=a

a=b

b=c

print(a,b,”\n”)

coroutine.yield (a+b,b-a)

end)

print( coroutine. resume(co,20, 10))    --> 10 20

                                                                        true 30 10

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: