当前位置: 首页 > 工具软件 > 协同放置 > 使用案例 >

Lua协同程序

索吕恭
2023-12-01

协同程序跟线程差不多,就是一个执行序列,拥有自己独立的栈,局部变量和指针
同时又与其它协同程序共享全局变量和其它大部分东西。跟线程的区别在于:
一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行;
一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停。

基础

Lua中所有协同程序的函数放置在 “coroutine” 的 table 中
create创建一个协同程序,参数是一个函数,该函数的代码就是协同程序所需执行的内容。返回一个thread类型的值,用以表示新的协同程序

local a = coroutine.create( function() print(xx) end )
local b = coroutine.create( function() print(xx) end )

thread: 0000029F639905A8
thread: 0000029F63990688

四个状态:挂起(suspended),运行(running),死亡(dead),正常(normal)
创建之后是挂起状态,可通过 status 来检查状态

print(coroutine.status(a)) --suspended
print(coroutine.resume(b))

coroutine.resume 用于启动或再次启动一个协同程序,将其状态改为运行
一般协同程序的内容调用后就终止了,然后处于死亡状态,无法返回。
函数 yield 可以让一个运行中的协同程序挂起,而之后可以再恢复它的运行

local a =
    coroutine.create(
    function()
        for i = 1, 10 do
            print(i)
            coroutine.yield()
        end
    end
)

coroutine.resume(a) -- 1 
coroutine.resume(a) -- 2 
coroutine.resume(a) -- 3 

上述例子中,函数执行一次之后就被挂起,等待下一次恢复
最后一次调用 resume 时,resume 将返回 false 和一条错误信息
当一个协同程序 A 唤醒另一个协同程序 B 时,协同程序 A 就处于一个特殊状态,既不是挂起,也不是运行,称为正常(normal)

 类似资料: