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
相关推荐
chicpopoo2 分钟前
Python打卡DAY30
开发语言·python
o0向阳而生0o9 分钟前
47、C#可否对内存进⾏直接的操作?
开发语言·c#·.net
快乐飒男1 小时前
c#基础01(.Net介绍)
开发语言·c#·.net
qq_584598921 小时前
day30python打卡
开发语言·人工智能·python·算法·机器学习
zhangpeng4555479401 小时前
C++--综合应用-演讲比赛项目
开发语言·c++·算法
火兮明兮2 小时前
Python训练第三十天
开发语言·python
啊我不会诶2 小时前
CF每日4题(1300-1400)
开发语言·c++·算法
学编程的小白狼2 小时前
C#:多线程
开发语言·c#
island13142 小时前
JAVA Web 期末速成
java·开发语言·前端
珊瑚里的鱼2 小时前
【滑动窗口】LeetCode 1004题解 | 最大连续1的个数 Ⅲ
开发语言·c++·笔记·算法·leetcode