当前位置: 首页 > news >正文

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 的线程号

代码示例

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

http://www.mrgr.cn/news/23160.html

相关文章:

  • HTTrack
  • 点餐小程序实战教程04变量定义和初始化
  • AI工具(不断更新)
  • OJ2219左移右移(链表)——蓝桥杯2022年国赛
  • 期货量化-群体优化算法:混合蛙跳算法(SFL)
  • 计算机毕业设计Pyhive+Spark招聘可视化 职位薪资预测 招聘推荐系统 招聘大数据 招聘爬虫 大数据毕业设计 Hadoop Scrapy
  • 哈希表的学习
  • TON的两种地址
  • CSS选择器
  • 【C++ 面试 - 新特性】每日 3 题(七)
  • 拉新充场行业内幕,3种赚钱方式和3个风险点,选副业谨慎入行!
  • 【通信管理之c++基础01】std::future
  • Unity Addressables 使用说明(三)构建内容(Build Content)
  • [基金理财] 投资组合的搭建
  • 干货分享|分享一款微软出品的工作效率神器 PowerToys
  • 【C++ 面试 - 新特性】每日 3 题(六)
  • 【C语言】字符串函数详细讲解
  • golang
  • 连锁企业管理系统管哪些 80%的连锁企业一开始选错了
  • Servlet(二)