一、coroutine.create创建协程

參数是协程的主函数,返回一个thread对象

co = coroutine.create(function()
print("coroutine execute!")
end)

二、协程状态

协程有三种状态:挂起(suspended)、执行(running)和死亡(dead)

coroutine.status(co)返回协程当前的状态

协程创建完之后处于挂起状态

print(coroutine.status(co))

输出:

suspended

三、运行协程

协程运行后。状态变为running,当协程主所有运行完之后,变为dead状态

coroutine.resume(co)
print(coroutine.status(co))

输出:

dead

主函数运行完时。它的返回的值和true一起作为相应resume的返回值

co = coroutine.create(function(a, b)
print("coroutine execute!")
return a + b
end)
print(coroutine.resume(co, 2, 3))

输出:

ture 5

四、中断协程

主函数运行过程中遇到coroutine.yield()中断,再次调用resume将从中断的位置開始运行

co = coroutine.create(function()
for i = 1, 2 do
print("before", i)
coroutine.yield()
print("after", i)
end
end)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))

输出:

suspended

before 1

suspended

after 1

before 2

suspended

after 2

dead



假设是被挂起yield函数有传參,这些參数和true一起作为相应resume的返回值

co = coroutine.create(function(a)
a = a + 1
coroutine.yield(a)
a = a + 1
return a
end)
print(coroutine.status(co))
print(coroutine.resume(co,1))
print(coroutine.status(co))
print(coroutine.resume(co,1))
print(coroutine.status(co))

输出:

suspended

true 2

suspended

true 3

dead




五、coroutine.wrap创建协程

參数是协程的主函数。返回一个函数,每当调用这个返回函数,都会运行协程主函数。

返回值时yield或主函数的返回值,没有执行结果布尔值和错误码,因此无法检測出执行时的错误。也无法检查 wrap 所创建的协程的状态。

function co_func(a)
    local c = coroutine.yield(a + 1)
    return c * 2
end co = coroutine.wrap(co_func) ret1 = co(1)
print(ret1) ret2 = co(10)
print(ret2)

输出:

2

20

运行一次协程对象。协程就会被激活一次,再次调用时从上一次断点的地方继续运行。

挂起时yield的參数将作为返回值,再次激活时的參数将作为yield的返回值。

六、获得执行中的协程

函数 coroutine.running 用于返回正在执行中的协程,假设没有协程执行。则返回 nil

print("running:",coroutine.running())
co = coroutine.create(function()
print("running:",coroutine.running())
print("is co:", coroutine.running() == co)
print("status:", coroutine.status(coroutine.running()))
end)
coroutine.resume(co)
print("running:",coroutine.running())

输出:

running: nil

running: thread: 006DC380

is co: true

status: running

running: nil

lua学习笔记13:协程具体解释和举例的更多相关文章

  1. python 3.x 学习笔记17(协程以及I/O模式)

    1.协程(微线程)协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上一 ...

  2. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  3. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  4. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  5. Lua的函数调用和协程中,栈的变化情况

    Lua的函数调用和协程中,栈的变化情况 1. lua_call / lua_pcall   对于这两个函数,对栈底是没有影响的--调用的时候,参数会被从栈中移除,当函数返 回的时候,其返回值会从函数处 ...

  6. SQL反模式学习笔记13 使用索引

    目标:优化性能 改善性能最好的技术就是在数据库中合理地使用索引.  索引也是数据结构,它能使数据库将指定列中的某个值快速定位在相应的行. 反模式:无规划的使用索引 1.不使用索引或索引不足 2.使用了 ...

  7. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  8. (zt)Lua的多任务机制——协程(coroutine)

    原帖:http://blog.csdn.net/soloist/article/details/329381 并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制.大致上 ...

  9. Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法

    Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridP ...

随机推荐

  1. 两个JS对象怎样才能相等

    在JS中,两个对象如何才能相等?下面的两个 Alert,只有一个输出true.  在JS中如何才能构造出两个JS对象相等? var prop1 = {asd:{def:'abc'}}; var pro ...

  2. Java基础(七):重写与重载

    一.重写(Override): 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是 ...

  3. IOS中键盘隐藏几种方式

    在ios开发中,经常需要输入信息.输入信息有两种方式: UITextField和UITextView.信息输入完成后,需要隐藏键盘,下面为大家介绍几种隐藏键盘的方式. <一> 点击键盘上的 ...

  4. Inside GDALAllRegister之一: 五大部分

    基本信息 在GDAL的Tutorial中开篇即提到GDALAllRegister函数,它会注册所有已知的驱动,包括动态库自动加载的驱动.最关键是这句话: If for some application ...

  5. 在Linux上自动调整屏幕亮度保护眼睛

    导读 Lightbot当你开始在计算机前花费大量时间的时候,问题自然开始显现.这健康吗?怎样才能舒缓我眼睛的压力呢?为什么光线灼烧着我?尽管解答这些问题的研究仍然在不断进行着,许多程序员已经采用了一些 ...

  6. jquery解析XML及获取XML节点名称

    ).tagName $().tagName [].tagName[] $(].tagName context.nodeName $(this).context.nodeName function ge ...

  7. 消息队列的使用场景(转载c)

    作者:ScienJus链接:https://www.zhihu.com/question/34243607/answer/58314162来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  8. android 随手记 读写文件的几种方式

    java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 */ import java.io.BufferedRe ...

  9. 栈的应用实例——中缀表达式转换为后缀表达式

    声明:本程序读入一个中缀表达式,将该中缀表达式转换为后缀表达式并输出后缀表达式. 注意:支持+.-.*./.(),并且输入时每输入完一个数字或符号都要加一个空格,特别注意的是在整个表达式输入完成时也要 ...

  10. Hibernate学习笔记(十) — HQL查询

    一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JO ...