Lua协同程序Coroutine

Lua 协同程序(Coroutine)

定义

Lua 协同程序(Coroutine)与线程类似:拥有独立的堆栈、局部变量、指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

协同程序可以理解为一种特殊的线程,可以暂停和恢复其执行,从而允许非抢占式的多任务处理。协同是非常强大的功能,但是用起来也很复杂。

线程和协同程序区别

主要区别在于,一个程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。

在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。

线程 协程
调度方式 操作系统进行抢占式调度 非抢占式调度,由程序员控制
并发 并发执行,同时运行多个 协作运行,同时运行一个
内存占用 独立堆栈,开销大 共享堆栈、开销小
数据共享 共享内存空间 通过参数传递
调试 难以调试 相对简单

使用

协同程序由 coroutine 模块提供支持。

方法 描述
coroutine.create() 创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
coroutine.resume() 重启 coroutine,和 create 配合使用
coroutine.yield() 挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果
coroutine.status() 查看 coroutine 的状态 注:三种状态:dead,suspended,running,
coroutine.wrap() 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复
coroutine.running() 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 coroutine 的线程号

代码示例

lua 复制代码
function foo()
    print("协同程序 foo 开始执行")
    local value = coroutine.yield("暂停 foo 的执行")
    print("协同程序 foo 恢复执行,传入的值为: " .. tostring(value))
    print("协同程序 foo 结束执行")
end

-- 创建协同程序
local co = coroutine.create(foo)

-- 启动协同程序
local status, result = coroutine.resume(co)
print(result) -- 输出: 暂停 foo 的执行

-- 恢复协同程序的执行,并传入一个值
status, result = coroutine.resume(co, 42)
print(result) -- 输出: 协同程序 foo 恢复执行,传入的值为: 42

代码输出结果

复制代码
协同程序 foo 开始执行
暂停 foo 的执行
协同程序 foo 恢复执行,传入的值为: 42
协同程序 foo 结束执行
nil
相关推荐
兢兢业业的小白鼠23 分钟前
Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
java·开发语言·jvm·tomcat
Niuguangshuo33 分钟前
Python设计模式:代理模式
开发语言·python·代理模式
能来帮帮蒟蒻吗40 分钟前
GO语言学习(16)Gin后端框架
开发语言·笔记·学习·golang·gin
落榜程序员43 分钟前
Java 基础-29-final关键字-详解
java·开发语言
JavaPub-rodert1 小时前
一道go面试题
开发语言·后端·golang
6<71 小时前
【go】静态类型与动态类型
开发语言·后端·golang
车载小杜2 小时前
基于指针的线程池
开发语言·c++
沐知全栈开发2 小时前
Servlet 点击计数器
开发语言
m0Java门徒2 小时前
Java 递归全解析:从原理到优化的实战指南
java·开发语言
桃子酱紫君3 小时前
华为配置篇-BGP实验
开发语言·华为·php