【笔记】lua - 协程

发布于:2022-10-16 ⋅ 阅读:(317) ⋅ 点赞:(0)

文章目录


协程

其执行过程类似于不带返回值的函数调用。

一个程序可以包含多个协程,可以对比与一个进程包含多个线程:

  • 线程相互独立,有自己的上下文,切换受系统控制;
  • 协程也相对独立,也有自己的上下文,但是切换由自己控制。
    【由当前协程切换到其他协程由当前协程控制】
    【可以把协程看成是一个可自行决定调度切换的线程】

编成语言 Lua 从 5.0 版本开始支持协程的概念,极大的扩展了 Lua 的能力。

Lua 的协程通过扩展库 coroutine 来实现。

coroutine.close(co) ------------------------ 关闭协程,返回 bool
coroutine.create(f) ------------------------ 创建协程,传入一个 function,返回一个协程句柄
coroutine.isyieldable([co]) ---------------- 判断协程是否是 yield 状态
coroutine.resume(co, [, val1, ...]) -------- 将挂起状态的协程重新激活,val 参数,返回 true/false 运行状态
coroutine.running() ------------------------ 获取正在运行的协程
coroutine.status(co) ----------------------- 获取 co 句柄对应的协程的状态 [suspended(挂起), running(执行中), dead(结束)]
coroutine.wrap(f) -------------------------- 用 function 创建一个新的协程,返回一个函数,调用此函数,进入协程
coroutine.yield(...) ----------------------- 挂起当前协程

双循环切换

function func1()
    while true do
        print("func1--111")
        -- sleep(1)
        coroutine.yield()
    end
end

function func2()
    while true do
        print("func2--222")
        -- sleep(1)
        coroutine.yield()
    end
end

local handle1 = coroutine.create(func1)
local handle2 = coroutine.create(func2)

while(true) do
    print("==========")
    print(coroutine.status(handle1))
    print(coroutine.status(handle2))
    coroutine.resume(handle1)
    coroutine.resume(handle2)
    print(coroutine.status(handle1))
    print(coroutine.status(handle2))
end

-- ==========
-- suspended
-- suspended
-- func1--111
-- func2--222
-- suspended
-- suspended
-- ==========
-- suspended
-- suspended
-- func1--111
-- func2--222
-- suspended
-- suspended
-- ...
-- ...
-- ...

迭代器

function iter()
    return coroutine.wrap(function()
        for i=1,3 do 
            coroutine.yield(i)
        end
        return nil
    end)
end

-- local f = iter()
-- print(f())
-- print(f())
-- print(f())
-- print(f())

for i in iter() do
    print(i)
end

-- 1
-- 2
-- 3
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到