Lua Coroutine协同式多线程

本文详细介绍了Lua中协程的基本概念、创建、运行、终止、切换及状态,通过实例展示了如何使用协程实现任务并发,并探讨了coroutine.wrap()函数的作用与使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

Lua 为每个 coroutine 提供一个独立的运行线路。 然而和多线程系统中的线程不同,coroutine 只在显式的调用了 yield 函数时才会挂起。

创建: coroutine.create

运行: 第一次使用coroutine.resume就可以把创建的coroutine运行起来。

终止: 一种是自身函数执行完了, 另一种是非正常退出,它发生在未保护的错误发生的时候。 第一种情况中, coroutine.resume 返回 true , 接下来会跟着 coroutine 主函数的一系列返回值。 第二种发生错误的情况下, coroutine.resume 返回 false , 紧接着是一条错误信息。

切换: coroutine.yield可以切换出去,resume可以使其返回。

状态: 协程有4种状态,suspended, running, dead, normal (可以coroutine.status(co)来查看)

coroutine.wrap(): 创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复

coroutine.running() : 返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号

例子:

1. 切换和状态

local function foo(sumNum, yieldNum)
    for i=1,sumNum do
        print("co", i)
        if i == yieldNum then
            coroutine.yield()
        end
    end
end

local co = coroutine.create(foo)
coroutine.resume(co, 10, 5)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
print(coroutine.resume(co))
print(coroutine.status(co))

输出:

co    1
co    2
co    3
co    4
co    5
suspended
co    6
co    7
co    8
co    9
co    10
dead
false    cannot resume dead coroutine
dead
[Finished in 0.0s]

2. coroutine.wrap

local function foo(sumNum, yieldNum)
    for i=1,sumNum do
        print("co", i)
        if i == yieldNum then
            coroutine.yield()
        end
    end
end

local co = coroutine.wrap(foo)
co(10, 5)

输出:

co    1
co    2
co    3
co    4
co    5
[Finished in 0.0s]

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值