Lua之协同程序

协程介绍

协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局 部变量,有自己的指令指针,但是和其他协同程序共享全局变量等很多信息。线程和协 同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线 程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这 个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起

基础语法 基于Lua5.3版本

关于协程的操作作为基础库的一个子库, 被放在一个独立表 coroutine 中

协同有三个状态:挂起态(suspended)、运行态(running)、停止态(dead)。

coroutine.create (f)

创建一个主体函数为 f 的新协程。 f 必须是一个 Lua 的函数。 返回这个新协程,它是一个类型为 “thread” 的对象。通常情况下,create 的参数是一个匿名函数。当我们创建协同程序成功时,其为挂起态,即此时协同程序并未运行。

coroutine.isyieldable ()

如果正在运行的协程可以让出,则返回真。

不在主线程中或不在一个无法让出的 C 函数中时,当前协程是可让出的。

coroutine.resume (co [, val1, ···])

开始或继续协程 co 的运行。 当你第一次延续一个协程,它会从主体函数处开始运行。 val1, … 这些值会以参数形式传入主体函数。 如果该协程被让出,resume 会重新启动它; val1, … 这些参数会作为让出点的返回值。

如果协程运行起来没有错误, resume 返回 true 加上传给 yield 的所有值 (当协程让出), 或是主体函数的所有返回值(当协程中止)。 如果有任何错误发生, resume 返回 false 加错误消息。

coroutine.running ()

返回当前正在运行的协程加一个布尔量。 如果当前运行的协程是主线程,其为真。

coroutine.status (co)

以字符串形式返回协程 co 的状态: 当协程正在运行(它就是调用 status 的那个) ,返回 “running”; 如果协程调用 yield 挂起或是还没有开始运行,返回 “suspended”; 如果协程是活动的,都并不在运行(即它正在延续其它协程),返回 “normal”; 如果协程运行完主体函数或因错误停止,返回 “dead”。

coroutine.wrap (f)

创建一个主体函数为 f 的新协程。 f 必须是一个 Lua 的函数。 返回一个函数, 每次调用该函数都会延续该协程。 传给这个函数的参数都会作为 resume 的额外参数。 和 resume 返回相同的值, 只是没有第一个布尔量。 如果发生任何错误,抛出这个错误。

coroutine.yield (···)

挂起正在调用的协程的执行。 传递给 yield 的参数都会转为 resume 的额外返回值。

语法示例

  • 基础语法示例一
--协同程序co--
co = coroutine.create( function() 
    print("co")
    coroutine.yield() --遇到yield改协程就会挂起,等待你通过resume函数重新激活它
    end
 )
print(co)

--协同程序co1--
co1 = coroutine.create(function() 
    for i = 1,20 do
    print("co"..1)
    coroutine.yield() 
    end
end
)
print(co1)

--两个协成同时运行
coroutine.resume(co)
coroutine.resume(co1)

--输出这个时候两个协程的状态
print("co's status: "..coroutine.status(co))
print("co1's status: "..coroutine.status(co1))

--再次将两个挂起的协程运行
coroutine.resume(co)
coroutine.resume(co1)

--再次输出这个时候两个协程的状态
print("co's status: "..coroutine.status(co))
print("co1's status: "..coroutine.status(co1))

这里写图片描述

  • 基础语法二—— 五,代码较少合到了一起
--基础语法示例二
--如果没有相应的 yield,resume 把额外的参数传递给协同的主程序co2
co2 = coroutine.create(function(a,b,c)
    print("co2",a+b+c)
    end
)
coroutine.resume(co2,1,2,3)
--基础语法示例三
--resume 返回除了 true 以外的其他部分将作为参数传递给相应的 yield 
co3 = coroutine.create(function(a,b)
    coroutine.yield(a+b,a-b)
    end
)
print("co3",coroutine.resume(co3,20,10))

--基础语法示例四
--,yield 返回的额外的参数也将会传递给 resume
co4 = coroutine.create(function()
    print("co4",coroutine.yield())
    end
)
coroutine.resume(co4)
coroutine.resume(co4,4,5)

--基础语示例五
--当协同代码结束时主函数返回的值都会传给相应的 resume
co5 = coroutine.create(function()
    return 6,7
    end
)
print("co5",coroutine.resume(co5))

这里写图片描述

结语

我们很少在同一个协同程序中使用这几种特性,但每一种都有其用处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值