Lua中协程相关函数使用详解

更多信息 进群了解
QQ群:756167961

Lua 中的协程(coroutine)提供了一种协作式多任务处理机制,允许在多个任务间切换执行。以下是协程相关函数的详细说明及使用示例:


1. coroutine.create(f)

  • 作用:创建一个新的协程,参数 f 是协程要执行的函数。
  • 返回值:返回协程对象(类型为 thread),协程初始状态为 suspended
  • 示例
    local co = coroutine.create(function()
        print("Hello from coroutine!")
    end)
    print(type(co))  --> thread
    

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

  • 作用:启动或恢复协程 co 的执行。首次调用时参数传递给协程函数;后续调用时参数作为 yield 的返回值。
  • 返回值
    • 第一个值为布尔值(表示是否成功执行)。
    • 后续值为协程中 yield 的参数或函数返回值。
  • 示例
    local co = coroutine.create(function(a, b)
        local sum = a + b
        coroutine.yield(sum)
        return "done"
    end)
    
    print(coroutine.resume(co, 1, 2))  --> true, 3(第一次 resume,执行到 yield)
    print(coroutine.resume(co))         --> true, "done"(第二次 resume,执行到 return)
    

3. coroutine.yield([val1, ...])

  • 作用:挂起当前协程的执行,并将参数传递给 resume 的调用者。
  • 返回值:当协程恢复时,返回传递给 resume 的参数。
  • 示例
    local co = coroutine.create(function()
        print("Start")
        local x = coroutine.yield("yielded")
        print("Resumed with:", x)
    end)
    
    coroutine.resume(co)  --> 输出 "Start",返回 true, "yielded"
    coroutine.resume(co, 10)  --> 输出 "Resumed with: 10"
    

4. coroutine.status(co)

  • 作用:返回协程的状态,可能值为:
    • "suspended":挂起状态(可恢复)。
    • "running":正在运行。
    • "dead":执行完毕。
    • "normal":活跃但不在运行(例如正在恢复其他协程)。
  • 示例
    local co = coroutine.create(function() end)
    print(coroutine.status(co))  --> suspended
    coroutine.resume(co)
    print(coroutine.status(co))  --> dead
    

5. coroutine.wrap(f)

  • 作用:与 create 类似,但返回一个函数。调用该函数等同于调用 resume,但不会返回布尔值,错误时会直接抛出异常。
  • 示例
    local f = coroutine.wrap(function()
        coroutine.yield(1)
        return 2
    end)
    
    print(f())  --> 1
    print(f())  --> 2
    -- print(f())  --> 错误:attempt to call a dead coroutine
    

6. coroutine.running()

  • 作用:返回当前正在运行的协程及一个布尔值(表示是否为主协程)。
  • 示例
    local co = coroutine.create(function()
        print(coroutine.running())  --> thread:..., false(非主协程)
    end)
    print(coroutine.running())      --> thread:..., true(主协程)
    coroutine.resume(co)
    

7. coroutine.isyieldable()

  • 作用:检查当前协程是否可被挂起(yield)。在主线程或某些 C 函数中不可挂起。
  • 示例
    local co = coroutine.create(function()
        print(coroutine.isyieldable())  --> true
        coroutine.yield()
    end)
    coroutine.resume(co)
    print(coroutine.isyieldable())      --> false(主线程中)
    

协程状态转换示例

  1. 创建协程:初始状态为 suspended
  2. 首次 resume:状态变为 running,执行到 yield 后回到 suspended
  3. 再次 resume:从 yield 处恢复,执行完毕变为 dead
local co = coroutine.create(function()
    print("Step 1")
    coroutine.yield()
    print("Step 2")
end)

print(coroutine.status(co))  --> suspended
coroutine.resume(co)         --> 输出 "Step 1"
print(coroutine.status(co))  --> suspended
coroutine.resume(co)         --> 输出 "Step 2"
print(coroutine.status(co))  --> dead

总结

  • 协作式调度:协程需主动调用 yield 让出执行权。
  • 参数传递resume 的参数首次传递给协程函数,后续作为 yield 的返回值。
  • 错误处理:使用 wrap 时错误会抛出异常,而 resume 返回错误状态。
  • 状态管理:通过 statusisyieldable 检查协程状态和可操作性。

通过合理利用协程,可以实现非阻塞操作、生成器、状态机等复杂逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值