一、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. tp 生成静态页

    $this->fetch()返回的是html 可以直接写入到HTML文件内生成静态页

  2. WPF 处理路由事件

    (1)img.MouseUp+= img_MouseUp;(2)调用 UIElement.AddHandler()直接连接事件:img.AddHandler(Image.MouseUpEvent, n ...

  3. Sublime Text自定义插入当前时间的插件

    很奇怪为什么强大的Sublime编辑器为什么没有添加当前时间的快捷键,不过还好Sublime可以通过自定义插件的方式来实现任何你想要的效果   1. 创建插件:   Tools → New Plugi ...

  4. DB2数据源在Spring环境中的配置

    简单记录一下,以备不时之需. DB2的java驱动包可以在这里下载:http://pan.baidu.com/s/1gOoEJ DB2数据源的配置如下,粗体字部分是需要根据实际情况修改的: <b ...

  5. Solr添加SolrDocument报错

    今天写了一个solr入库接口,使用了SolrServer.addBean接口,结果报错:Caused by: org.apache.solr.client.solrj.impl.HttpSolrSer ...

  6. 小米电视支付SDK接入air坑爹之路

    1. air的包名在生成android后会加入一个air的前缀变为air.***.***.mibox.包名与appid和appkey必须相相应才行,不然会一直返回40000错误 2. 加入了Nativ ...

  7. 腾讯地图api将物理地址转化成坐标

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. MariaDB删除重复记录性能测试

    删除重复记录,只保留id最大的一条记录的性能测试 环境 测试表的id为是唯一的,或是自增的主键. mysql不能直接写循环,只能写在存储过程里. 存储过程usp_batch_insert的参数num_ ...

  9. [Unity-1] Unity简单介绍

    Unity是一套包含图形.声音.物理等功能的游戏引擎,提供了一个强大的关卡编辑器.支持大部分主流3D软件格式,使用C#或者JavaScript等高级语言实现脚本功能.使开发人员无需了解底层复杂技术,高 ...

  10. 从Java的堆栈到Equals和==的比較

    认识Java中堆和栈 栈与堆都是Java用来在Ram中存放数据的地方. 与C++不同.Java自己主动管理栈和堆,程序猿不能直接地设置栈或堆. Java的堆是一个执行时数据区,类的对象从中分配空间.这 ...