找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

2

听众

108

主题
发表于 2024-6-20 22:38:20 | 查看: 185| 回复: 0
Lua 基础教学:第七篇协程(Coroutines)
在本篇文章中,我们将探讨 Lua 中的协程(coroutines)。协程是 Lua 提供的一种高级特性,允许我们在单线程环境中实现并发操作。
什么是协程?
协程是一种控制结构,可以暂停和恢复函数的执行。与线程不同,协程是非抢占式的,即在一个协程运行时,不会自动切换到其他协程。我们需要显式地切换协程。
创建和使用协程
Lua 提供了 coroutine 模块来创建和操作协程。主要的函数包括:
  • coroutine.create: 创建一个新的协程
  • coroutine.resume: 恢复协程的执行
  • coroutine.yield: 暂停协程的执行
  • coroutine.status: 获取协程的状态
  • coroutine.wrap: 创建并返回一个函数,调用该函数时会自动恢复协程

创建协程
我们可以使用 coroutine.create 函数创建一个协程。这个函数接受一个函数作为参数,并返回一个新的协程。
local co = coroutine.create(function()
    for i = 1, 5 do
        print("Co-routine: " .. i)
        coroutine.yield()  -- 暂停协程
    end
end)恢复协程
使用 coroutine.resume 可以恢复协程的执行。每次调用 resume,协程都会继续执行直到遇到 yield 或执行完毕。
coroutine.resume(co)  -- 输出:Co-routine: 1
coroutine.resume(co)  -- 输出:Co-routine: 2
coroutine.resume(co)  -- 输出:Co-routine: 3
coroutine.resume(co)  -- 输出:Co-routine: 4
coroutine.resume(co)  -- 输出:Co-routine: 5获取协程状态
使用 coroutine.status 可以获取协程的状态。可能的状态有:
  • "suspended": 协程已创建或调用 yield 后暂停
  • "running": 协程正在运行
  • "dead": 协程执行完毕

local status = coroutine.status(co)
print("Status: " .. status)  -- 输出:Status: dead使用 coroutine.wrap
coroutine.wrap 创建一个协程并返回一个函数,每次调用该函数时会自动恢复协程。
local co = coroutine.wrap(function()
    for i = 1, 3 do
        print("Wrapped co-routine: " .. i)
        coroutine.yield()
    end
end)

co()  -- 输出:Wrapped co-routine: 1
co()  -- 输出:Wrapped co-routine: 2
co()  -- 输出:Wrapped co-routine: 3协程之间的通信
协程之间可以通过 yield 和 resume 传递参数。
local co = coroutine.create(function(a, b)
    print("Sum: " .. (a + b))
    local c, d = coroutine.yield(a + b)
    print("Product: " .. (c * d))
end)

coroutine.resume(co, 10, 20)  -- 输出:Sum: 30
coroutine.resume(co, 5, 2)    -- 输出:Product: 10实现生产者-消费者模式
协程常用于实现生产者-消费者模式。
local producer = coroutine.create(function()
    for i = 1, 5 do
        print("Producing: " .. i)
        coroutine.yield(i)
    end
end)

local consumer = coroutine.create(function()
    while true do
        local status, value = coroutine.resume(producer)
        if not status then break end
        print("Consuming: " .. value)
    end
end)

coroutine.resume(consumer)总结
在这篇教程中,我们介绍了 Lua 中的协程。我们学习了如何创建和使用协程,如何在协程之间传递参数,以及如何利用协程实现生产者-消费者模式。协程是 Lua 中非常强大和灵活的特性,适用于需要并发执行的场景。在接下来的教程中,我们将探讨 Lua 中的垃圾回收机制。
继续关注我们的 Lua 教程系列,如果你有任何问题或建议,请在评论区留言。
您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-3-12 23:28 , Processed in 0.487906 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表