文章目录

  • 双循环切换
  • 迭代器

协程

其执行过程类似于不带返回值的函数调用。

一个程序可以包含多个协程,可以对比与一个进程包含多个线程:

  • 线程相互独立,有自己的上下文,切换受系统控制;
  • 协程也相对独立,也有自己的上下文,但是切换由自己控制。
    【由当前协程切换到其他协程由当前协程控制】
    【可以把协程看成是一个可自行决定调度切换的线程】

编成语言 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 - 协程相关推荐

  1. Lua协程Coroutine是什么

    Lua协程Coroutine是什么 协程和线程不同: 同一时刻,一个多线程程序可以用多个线程同时执行:而协程只能有一个在执行 多线程是抢占式的:而协程是非抢占式的,只有协程显示被挂起,才会被挂起 协程 ...

  2. Unity协程实现分析以及Lua协程与Unity协程的混合使用

    1,节选翻译一篇stackoverflow关于Unity协程实现的讨论 - The big clues are in the C# version. Firstly, note that the re ...

  3. Lua 协程和线程区别

    协程就是协程,不是线程. CPU执行单位是线程,不是什么协程. 协程,是同步执行,不是并行,只是切了一个上下文了,为你保存原来的上下文而已. 切到第二个协程时,原来的协程处于挂起状态. 这个特指lua ...

  4. lua协程 unity_XLua 之 Lua 协程 与 Unity 协程互通

    前言: 最近在摸索用XLua 在 Unity 中进行全Lua 开发.然后就遇到了协程的问题.我想在 Lua 侧开启一个 Unity 的协程,该怎么做呢? 一开始我先去翻 XLua 的文档,我记得之前我 ...

  5. lua学习笔记之协程

    1.基础 所有协程相关的在表coroutine中,创建通过create来创建,参数为函数,返回值类型为thread. 协程状态有:suspended, running, normal, dead.通过 ...

  6. 对lua协程的一点理解

    读<Programming In Lua>协程那一章,比较困惑的还是procuer-consumer那个例子: function consumer(prod)while true dolo ...

  7. lua协程 unity_unity协程coroutine浅析

    一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下,通过前辈的文章大体理解了一下,在这儿抛砖引玉写一些个人理解.当然首先给出几篇 ...

  8. LUA 协程 Coroutine

    协程 Coroutine 协程(coroutine)并不是 Lua 独有的概念,如果让我用一句话概括,那么大概就是:一种能够在运行途中主动中断,并且能够从中断处恢复运行的特殊函数.(嗯,其实不是函数. ...

  9. Go语言学习笔记 - PART13 - 协程与通道

    协程 应用程序处理并发的部分 协程跟操作系统的线程之间不是一对一的关系 协程是独立执行的,它们之间必须同行才会变得有用 通道 负责协程之间的通信,从而避免所有由共享内存导致的陷阱 通道只能传输一种类型 ...

最新文章

  1. Scala入门到精通——第二十九节 Scala数据库编程
  2. Redis 文档阅读笔记 (一)
  3. 关于Socket建立长连接遇到的bug信息
  4. Jenkins+ant+Jenkins接口持续集成测试配置
  5. ogg批量配置_Macos上一款批量文件重命名工具A Better Finder Rename 11
  6. 302状态码_HTTP协议详解(基础概念 方法 状态码 首部 连接 Cookie 新特性 安全)
  7. 程序员未来的职业生涯路该怎么走,如何避免35岁中年危机?
  8. Jquery 中each循环嵌套的使用示例教程
  9. vue Mutation 必须是同步函数 为什么_为什么vue组件中data必须用函数表达?
  10. c 按输入的字母来输出对应效果
  11. 溯雪-轻博客PHP开源系统
  12. 【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )
  13. 第二章.物理层:2.6宽带接入技术
  14. 野火 FireConfig 配置连接Wifi
  15. 使用spark-submit工具提交Spark作业
  16. 电脑动态壁纸软件哪个好用:试试Wallpaper Engine离线版吧
  17. python中def main是什么意思_浅析Python中的main函数
  18. 【vijos】1770 大内密探(树形dp+计数)
  19. 【100%通过率】华为OD机试真题 C++ 实现【完美走位】【2022.11 Q4新题】
  20. 新随笔--读书笔记《学会提问》:学习提出好问题的思维方法

热门文章

  1. python调用百度AI识别文字和表格
  2. LiveGBS-摄像机网页低延时无插件直播实现
  3. 【DKN】(五)attention.py
  4. xp系统远程桌面关闭计算机,WinXP如何打开远程桌面?WinXP打开远程桌面的命令是什么?...
  5. Python爬虫入门教程导航帖
  6. 模拟抽奖过程的C语言程序设计,C++抽奖程序实现方法
  7. 在CentOS 7最小环境下安装Cinnamon桌面环境
  8. 华为手机怎么使用分屏_这是一份华为手机必备小技巧使用说明
  9. 对学姐的U-net网络的学习杂记
  10. python羊车门问题的蒙特卡洛解法