十五、Lua 协同程序(coroutine)的学习

 Lua 协同程序(coroutine)


什么是协同(coroutine)?

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

协同是非常强大的功能,但是用起来也很复杂。

线程和协同程序区别

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

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

协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。

基本语法

以下实例演示了以上各个方法的用法:

coroutine_test.lua 文件

-- coroutine_test.lua 文件
co = coroutine.create(
    function(i)
        print(i);
    end
)
 
coroutine.resume(co, 1)   -- 1
print(coroutine.status(co))  -- dead
 
print("----------")
 
co = coroutine.wrap(
    function(i)
        print(i);
    end
)
 
co(1)
 
print("----------")
 
co2 = coroutine.create(
    function()
        for i=1,10 do
            print(i)
            if i == 3 then
                print(coroutine.status(co2))  --running
                print(coroutine.running()) --thread:XXXXXX
            end
            coroutine.yield()
        end
    end
)
 
coroutine.resume(co2) --1
coroutine.resume(co2) --2
coroutine.resume(co2) --3
 
print(coroutine.status(co2))   -- suspended
print(coroutine.running())
 
print("----------")

以上实例执行输出结果为:

1
dead
----------
1
----------
1
2
3
running
thread: 0x7fb801c05868    false
suspended
thread: 0x7fb801c04c88    true
----------

coroutine.running就可以看出来,coroutine在底层实现就是一个线程。

当create一个coroutine的时候就是在新线程中注册了一个事件。

当使用resume触发事件的时候,create的coroutine函数就被执行了,当遇到yield的时候就代表挂起当前线程,等候再次resume触发事件。

接下来我们分析一个更详细的实例:

实例

function foo (a)
    print("foo 函数输出", a)
    return coroutine.yield(2 * a) -- 返回  2*a 的值
end
 
co = coroutine.create(function (a , b)
    print("第一次协同程序执行输出", a, b) -- co-body 1 10
    local r = foo(a + 1)
     
    print("第二次协同程序执行输出", r)
    local r, s = coroutine.yield(a + b, a - b)  -- a,b的值为第一次调用协同程序时传入
     
    print("第三次协同程序执行输出", r, s)
    return b, "结束协同程序"                   -- b的值为第二次调用协同程序时传入
end)
       
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---分割线---")

以上实例执行输出结果为:

第一次协同程序执行输出    1    10
foo 函数输出    2
main    true    4
--分割线----
第二次协同程序执行输出    r
main    true    11    -9
---分割线---
第三次协同程序执行输出    x    y
main    true    10    结束协同程序
---分割线---
main    false    cannot resume dead coroutine
---分割线---

以上实例接下如下:

  • 调用resume,将协同程序唤醒,resume操作成功返回true,否则返回false;
  • 协同程序运行;
  • 运行到yield语句;
  • yield挂起协同程序,第一次resume返回;(注意:此处yield返回,参数是resume的参数)
  • 第二次resume,再次唤醒协同程序;(注意:此处resume的参数中,除了第一个参数,剩下的参数将作为yield的参数)
  • yield返回;
  • 协同程序继续运行;
  • 如果使用的协同程序继续运行完成后继续调用 resume方法则输出:cannot resume dead coroutine

resume和yield的配合强大之处在于,resume处于主程中,它将外部状态(数据)传入到协同程序内部;而yield则将内部的状态(数据)返回到主程中。


生产者-消费者问题

现在我就使用Lua的协同程序来完成生产者-消费者这一经典问题。

实例

local newProductor

function productor()
     local i = 0
     while true do
          i = i + 1
          send(i)     -- 将生产的物品发送给消费者
     end
end

function consumer()
     while true do
          local i = receive()     -- 从生产者那里得到物品
          print(i)
     end
end

function receive()
     local status, value = coroutine.resume(newProductor)
     return value
end

function send(x)
     coroutine.yield(x)     -- x表示需要发送的值,值返回以后,就挂起该协同程序
end

-- 启动程序
newProductor = coroutine.create(productor)
consumer()

以上实例执行输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
……

微服务 spring cloud
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua 协同程序
班门弄斧
04-17 896
协同程序(coroutine)简介 Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。 线程和协同程序区别 1.线程可以同时运行,协同程序却需要彼此协作的运行。 2.在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。 协同程序有点类似...
Lua协同程序coroutine详解
RapdoZoroの博客
01-10 2589
lua语言中有协同程序这一特性。协同程序是什么呢? 线程大家都知道吧,一系列指令组成一个线程,线程是程序执行流的最小单元,许多线程会组成一个进程,一般来说一个应用程序就是一个进程。协同程序和线程差不多,也是处于线程这一级别的执行流最小单元,并且都是由一系列代码指令组成。但协同程序和线程的最大区别就是:程序中的多个线程可以同时运行(即多线程),而多个协同程序却不能同时运行。 这里多说一句,多线
Lua协同程序
weixin_34163553的博客
05-28 137
Lua是一种简单,可扩展,可移植及高效的脚本语言。在嵌入式系统,移动设备,web服务器,游戏等方面都能见到它的身影。lua其中最吸引人的一点事它能很方便地与C语言或者其他语言。 这里说的是lua语言中的协同程序(coroute),也有人翻译成为协作程序 基本函数和语法 coroutine就是lua协同程序 先讲一下coroutine的语法: coroutine.create() ...
Lua 协同程序(coroutine)
类人_猿的博客
10-26 382
Lua 协同程序(coroutine) 什么是协同(coroutine)? Lua协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其他大部分东西。 协同是非常强大的功能,但是用起来也很复杂。 线程和协同程序区别 线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。...
Lua编程笔录--Lua初识及语法六(协同程序
AdamBieber的专栏
11-22 747
前言:前面的知识点可以参考  Lua编程笔录--Lua初识及语法一(注释,变量命名,全局/局部变量,数据类型)http://blog.csdn.net/adambieber/article/details/53259237 Lua编程笔录--Lua初识及语法二(循环,流程控制,函数) http://blog.csdn.net/adambieber/article/details/53260
Lua协同程序coroutine的简介及优缺点
09-20
Lua协同程序,或称为coroutine,是一种轻量级的并发机制,它在Lua编程语言中扮演着重要的角色。不同于线程,协同程序在概念上更接近于子程序,但它们允许非阻塞的暂停和恢复,使得在单线程环境中实现异步操作成为...
Lua协同程序coroutine代码实例
09-22
Lua是一门简单而强大的轻量级脚本语言,它采用了协程(coroutine)这种高级特性来支持协作式的多任务处理。在多线程编程中,协程为...但是上述知识点的描述依然可以清晰的传达Lua协同程序的核心概念和基本使用方法。
Lua 协同程序coroutine
liaosheng:)
08-01 395
前言 Lua协同程序: 开启另一个逻辑处理和c#一样,同一时间只能有一个协同程序被执行 线程:同一时间,可以有多个线程执行 进程:线程的一个载体,一个程序的运行独立为一个进程,进程和进程之间都有自己独立的储存单元、一个进程可以包含多个线程、多个线程之间共享存储单元。 比如打开一个手机游戏,这个游戏就有一个进程,游戏内部有很多线程同时运行,线程都有一个共享单元来获取存储数据 Lua中协同程...
[转]Lua语言基础汇总(7) -- 协同程序
weixin_30535167的博客
07-24 108
前言 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈、局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停。 协...
Lua协同程序
昔拉的博客
02-16 527
协同程序 协同程序coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协同程序共享全局变量等很多信息。线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。 协同是非常强大的功...
lua 协同程序(coroutine)
大猪的博客
04-03 494
本文主要是根据菜鸟教程的lua协同程序(coroutine)优化出来的文章。 对于网上的lua协同程序的文章,觉得菜鸟教程里的lua协同程序(coroutine)比较完善,但还是有一些没说清楚,对于像我这样的新手学习起来,还是不能完全解惑,故在前人的文章上再作详细的注释。 以下红色字体为修改部分。 什么是协同(coroutine)? Lua 协同程序(coroutine)与
Lua协同程序(coroutine)
koganlee的博客
07-07 2383
协同程序和线程差不多,也就是一条执行序列,拥有自己独立的栈、局部变量和指针, 同时又与其他协同程序共享全局变量和其他大部分东西。与线程区别:一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说一个具有多个协同程序的程序在任意时刻只能和运行一个协同程序,并且正在运行的协同程序只会在显示地要求挂起(suspend)时,它的执行才会暂停。协同程序基础Lua将所有关于协同程序...
Lua协同程序coroutine
GreAmbWang的博客
04-16 1023
协同程序coroutine) 线程与协程的区别 线程:同一时刻多个线程可以同时执行 协程:任意时刻只有一个协同程序在运行 coroutine方法 coroutine.create() 创建一个协程,参数为一个函数 fun =function (a,b) print(a+b) end co = coroutine.create(fun) coroutine.resume(co,2,3) ...
Lua 协同程序coroutine
阿童木的博客
01-06 1357
什么是协同程序Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。协同是非常强大的功能,但是用起来也很复杂。线程和协同程序区别线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有
Lua程序设计:简体中文版
“Programming in Lua” 是一本专注于 Lua 编程语言的中文版指南,由 Roberto Ierusalimschy 撰写,...通过学习 Lua,你可以掌握一种强大而灵活的工具,适用于各种应用场景,从游戏开发到系统管理,再到嵌入式系统。
写文章

热门文章

  • Spring Cloud Alibaba + mybatis + Element UI 前后端分离 分布式微服务高并发数据平台化(中台)思想+多租户saas企业开发架构技术 4244
  • Spring Cloud Alibaba + mybatis + Element UI 前后端分离 分布式微服务高并发数据平台化(中台)思想+多租户saas企业开发架构技术 4051
  • 多租户saas企业开发架构 前后端分离 Spring Cloud Alibaba + mybatis + Element UI 分布式微服务高并发数据平台化(中台)思想 3850
  • 架构基本概念和架构本质 3725
  • Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 3538

分类专栏

  • 直播电商 52篇

最新评论

  • 我与算法有个约会 —— 精心设计的偶遇

    CSDN-Ada助手: 算法 技能树或许可以帮到你:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm

  • 配置PostgreSQL用于集成测试的步骤

    小王毕业啦: 博主的这篇关于配置PostgreSQL用于集成测试的步骤的文章让我受益匪浅,深入浅出地为我解析了这一主题。从文章中我感受到了博主对于技术知识的深厚功底和丰富经验。期待着博主未来能够继续分享更多这样有价值的文章,希望在博主的指导下能够不断进步。非常感谢博主的用心分享和支持!

  • 从SRE视角透视DevOps的构建精髓

    穷苦书生_万事愁: 博主这篇文章确实让我对SRE视角透视DevOps的构建精髓有了全新的认识,深入浅出地解析了这一复杂课题,让我受益匪浅。博主的文字清晰明了,逻辑严谨,表达方式简洁明了,让我能够轻松理解其中的要点。通过博主的分享,我对DevOps的实践和原则有了更深入的理解,受益匪浅。希望博主能够继续保持分享好文的热情,让更多的读者受益。同时,也希望能够得到博主的指导,共同学习进步。非常感谢博主为我们带来如此有价值的文章,期待更多精彩的内容。感谢博主的坚持和支持!

  • 招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本

    Jang小鱼: 开源吗

  • 基于Spring Boot、Mybatis、Redis和Layui的企业电子招投标系统源码实现与立项流程

    Lion Long: 文章写得很好,初来乍到,希望多多关注。期待更多文章!

大家在看

  • 【Linux】僵尸进程和孤儿进程 1089
  • 学习笔记目录 41
  • def L_model_backward(AL, Y, caches): 528
  • 免费送源码:Java+ssm+MySQL SSM二手物品管理系统 计算机毕业设计原创定制
  • 打卡信奥刷题(097)用C++信奥P1079[普及组/提高] [NOIP2012 提高组] Vigenère 密码

最新文章

  • 未来五年:IPD产品团队领航创新变革
  • Javaava版本ERP管理系统源码-打造企业核心竞争力:ERP管理系统创新实践
  • 配置PostgreSQL用于集成测试的步骤
2024
10月 10篇
09月 13篇
08月 13篇
07月 13篇
06月 24篇
05月 46篇
04月 46篇
03月 46篇
02月 15篇
01月 49篇
2023年476篇
2022年428篇
2021年26篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢雕塑重量怎么算美陈商场吊环商场春季美陈ppt贵阳个性化玻璃钢雕塑供应商商场七夕气球美陈四川户外商场美陈市场价安徽卡通玻璃钢雕塑阳江玻璃钢雕塑的特点名图玻璃钢雕塑厂家东莞商场美陈公司清远玻璃钢农耕人物雕塑常州汕头玻璃钢雕塑北京步行街玻璃钢雕塑优势湛江玻璃钢卡通人物雕塑优质玻璃钢马雕塑网址玻璃钢花盆哪家强些敦煌玻璃钢价值观雕塑山东常见商场美陈多少钱吉安玻璃钢果蔬雕塑汕头玻璃钢游戏人物雕塑遵义商场美陈生产玻璃钢校园雕塑公司电话洛阳抽象玻璃钢卡通雕塑厂家南京玻璃钢雕塑工厂商场气球美陈火烈鸟台州玻璃钢广场雕塑价格荆门商场美陈花器杭州玻璃钢陶瓷雕塑图片革命主题玻璃钢卡通雕塑山东玻璃钢雕塑供应商香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化