【笔记】lua - 协程
文章目录
- 双循环切换
- 迭代器
协程
其执行过程类似于不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程:
- 线程相互独立,有自己的上下文,切换受系统控制;
- 协程也相对独立,也有自己的上下文,但是切换由自己控制。
【由当前协程切换到其他协程由当前协程控制】
【可以把协程看成是一个可自行决定调度切换的线程】
编成语言 Lua 从 5.0 版本开始支持协程的概念,极大的扩展了 Lua 的能力。
Lua 的协程通过扩展库 coroutine 来实现。
coroutine.close(co) ------------------------ 关闭协程,返回 bool
coroutine.create(f) ------------------------ 创建协程,传入一个 function,返回一个协程句柄
coroutine.isyieldable([co]) ---------------- 判断协程是否是 yield 状态
coroutine.resume(co, [, val1, ...]) -------- 将挂起状态的协程重新激活,val 参数,返回 true/false 运行状态
coroutine.running() ------------------------ 获取正在运行的协程
coroutine.status(co) ----------------------- 获取 co 句柄对应的协程的状态 [suspended(挂起), running(执行中), dead(结束)]
coroutine.wrap(f) -------------------------- 用 function 创建一个新的协程,返回一个函数,调用此函数,进入协程
coroutine.yield(...) ----------------------- 挂起当前协程
双循环切换
function func1()while true doprint("func1--111")-- sleep(1)coroutine.yield()end
endfunction func2()while true doprint("func2--222")-- sleep(1)coroutine.yield()end
endlocal handle1 = coroutine.create(func1)
local handle2 = coroutine.create(func2)while(true) doprint("==========")print(coroutine.status(handle1))print(coroutine.status(handle2))coroutine.resume(handle1)coroutine.resume(handle2)print(coroutine.status(handle1))print(coroutine.status(handle2))
end-- ==========
-- suspended
-- suspended
-- func1--111
-- func2--222
-- suspended
-- suspended
-- ==========
-- suspended
-- suspended
-- func1--111
-- func2--222
-- suspended
-- suspended
-- ...
-- ...
-- ...
迭代器
function iter()return coroutine.wrap(function()for i=1,3 do coroutine.yield(i)endreturn nilend)
end-- local f = iter()
-- print(f())
-- print(f())
-- print(f())
-- print(f())for i in iter() doprint(i)
end-- 1
-- 2
-- 3
【笔记】lua - 协程相关推荐
- Lua协程Coroutine是什么
Lua协程Coroutine是什么 协程和线程不同: 同一时刻,一个多线程程序可以用多个线程同时执行:而协程只能有一个在执行 多线程是抢占式的:而协程是非抢占式的,只有协程显示被挂起,才会被挂起 协程 ...
- Unity协程实现分析以及Lua协程与Unity协程的混合使用
1,节选翻译一篇stackoverflow关于Unity协程实现的讨论 - The big clues are in the C# version. Firstly, note that the re ...
- Lua 协程和线程区别
协程就是协程,不是线程. CPU执行单位是线程,不是什么协程. 协程,是同步执行,不是并行,只是切了一个上下文了,为你保存原来的上下文而已. 切到第二个协程时,原来的协程处于挂起状态. 这个特指lua ...
- lua协程 unity_XLua 之 Lua 协程 与 Unity 协程互通
前言: 最近在摸索用XLua 在 Unity 中进行全Lua 开发.然后就遇到了协程的问题.我想在 Lua 侧开启一个 Unity 的协程,该怎么做呢? 一开始我先去翻 XLua 的文档,我记得之前我 ...
- lua学习笔记之协程
1.基础 所有协程相关的在表coroutine中,创建通过create来创建,参数为函数,返回值类型为thread. 协程状态有:suspended, running, normal, dead.通过 ...
- 对lua协程的一点理解
读<Programming In Lua>协程那一章,比较困惑的还是procuer-consumer那个例子: function consumer(prod)while true dolo ...
- lua协程 unity_unity协程coroutine浅析
一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下,通过前辈的文章大体理解了一下,在这儿抛砖引玉写一些个人理解.当然首先给出几篇 ...
- LUA 协程 Coroutine
协程 Coroutine 协程(coroutine)并不是 Lua 独有的概念,如果让我用一句话概括,那么大概就是:一种能够在运行途中主动中断,并且能够从中断处恢复运行的特殊函数.(嗯,其实不是函数. ...
- Go语言学习笔记 - PART13 - 协程与通道
协程 应用程序处理并发的部分 协程跟操作系统的线程之间不是一对一的关系 协程是独立执行的,它们之间必须同行才会变得有用 通道 负责协程之间的通信,从而避免所有由共享内存导致的陷阱 通道只能传输一种类型 ...
最新文章
- Scala入门到精通——第二十九节 Scala数据库编程
- Redis 文档阅读笔记 (一)
- 关于Socket建立长连接遇到的bug信息
- Jenkins+ant+Jenkins接口持续集成测试配置
- ogg批量配置_Macos上一款批量文件重命名工具A Better Finder Rename 11
- 302状态码_HTTP协议详解(基础概念 方法 状态码 首部 连接 Cookie 新特性 安全)
- 程序员未来的职业生涯路该怎么走,如何避免35岁中年危机?
- Jquery 中each循环嵌套的使用示例教程
- vue Mutation 必须是同步函数 为什么_为什么vue组件中data必须用函数表达?
- c 按输入的字母来输出对应效果
- 溯雪-轻博客PHP开源系统
- 【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )
- 第二章.物理层:2.6宽带接入技术
- 野火 FireConfig 配置连接Wifi
- 使用spark-submit工具提交Spark作业
- 电脑动态壁纸软件哪个好用:试试Wallpaper Engine离线版吧
- python中def main是什么意思_浅析Python中的main函数
- 【vijos】1770 大内密探(树形dp+计数)
- 【100%通过率】华为OD机试真题 C++ 实现【完美走位】【2022.11 Q4新题】
- 新随笔--读书笔记《学会提问》:学习提出好问题的思维方法
热门文章
- python调用百度AI识别文字和表格
- LiveGBS-摄像机网页低延时无插件直播实现
- 【DKN】(五)attention.py
- xp系统远程桌面关闭计算机,WinXP如何打开远程桌面?WinXP打开远程桌面的命令是什么?...
- Python爬虫入门教程导航帖
- 模拟抽奖过程的C语言程序设计,C++抽奖程序实现方法
- 在CentOS 7最小环境下安装Cinnamon桌面环境
- 华为手机怎么使用分屏_这是一份华为手机必备小技巧使用说明
- 对学姐的U-net网络的学习杂记
- python羊车门问题的蒙特卡洛解法