3.3 Lua代码中的协程

什么是协程?

协程是一种用户态的轻量级线程,由用户控制调度。与操作系统线程不同:

  • 协程由程序显式控制切换

  • 开销极小,可创建成千上万个

  • 协作式调度,不会出现竞态条件

常用的协程API

Lua 复制代码
coroutine.close (co) --- 关闭协程,返回bool
coroutine.create (f) --- 创建协程,传入一个function,返回一个协程句柄
coroutine.isyieldable ([co]) --- 判断协程是否是 yield 状态
coroutine.resume (co [, val1, ...]) --- 将挂起态的协程重新激活
coroutine.running () --- 获取正在运行的协程
coroutine.status (co) --- 获取co句柄对应的协程的状态 {suspended(挂起), running(执行中), dead(结束)}
coroutine.wrap (f) --- 用function 创建一个新的协程
coroutine.yield (...) --- 挂起当前协程

示例代码:

Lua 复制代码
function myprint(a,b)
    print("协程",a,b);
    print("协程状态:",coroutine.status(handle1));
    coroutine.yield(1,2);
end

handle1=coroutine.create(myprint);--创建协程

print(coroutine.status(handle1));--获取当前协程的状态

print(coroutine.resume(handle1,123,999));--开始执行该协程

print(coroutine.status(handle1));

coroutine.close(handle1);

print(coroutine.status(handle1));

print(coroutine.running());

运行结果:

Lua 复制代码
suspended
协程	123	999
协程状态:	running
true	1	2
suspended
dead
thread: 00000000006f6ca8	true

双循环切换

Lua 复制代码
function sleep(seconds)
    local start = os.time()
    while os.time() - start < seconds do
        -- 空循环,占用 CPU
    end

end

function myprint1()
    while true do
        coroutine.resume(handle2);
        print("func1--111");
        sleep(1);
    end
end

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

handle1=coroutine.create(myprint1);--创建协程
handle2=coroutine.create(myprint2);--创建协程

coroutine.resume(handle1);

运行结果:

Lua 复制代码
func1--111
func2---222
func1--111
func2---222
func1--111
func2---222
func1--111
func2---222
相关推荐
2301_797312261 天前
学习Java26天
java·开发语言
cike_y1 天前
JSP原理详解
java·开发语言·jsp
爱装代码的小瓶子1 天前
【cpp进阶】c++11的新特性(概述版)
开发语言·c++
_OP_CHEN1 天前
【从零开始的Qt开发指南】(十一)Qt常用控件之多元素控件与容器类控件深度解析
开发语言·qt·前端开发·多元素控件·gui开发·qt常用控件·容器类控件
Robot侠1 天前
视觉语言导航从入门到精通(二)
开发语言·人工智能·python·llm·vln
SmoothSailingT1 天前
C#——Lazy<T>懒加载机制
开发语言·单例模式·c#·懒加载
程序喵大人1 天前
SQLITE问题整理
开发语言·数据库·c++·sqlite
Neolnfra1 天前
文件包含漏洞终极指南
开发语言·安全·web安全·网络安全·系统安全·php·可信计算技术
简单点好不好1 天前
2025--简单点--python之状态模式
开发语言·python·状态模式
1+2单片机电子设计1 天前
基于 STM32 的网络授权时钟系统设计与实现
开发语言·stm32·单片机·嵌入式硬件·php·51单片机