一、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. SonarQube代码质量管理平台 的安装、配置与使用

    SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 准备工作: 1.jdk(不再介绍) 2.sonarqube:ht ...

  2. WCF 添加 RESTful 支持,适用于 IIS、Winform、cmd 宿主

    You can expose the service in two different endpoints. the SOAP one can use the binding that support ...

  3. POJ 1564 Sum It Up (DFS+剪枝)

                                                                                                       ...

  4. TJ Holowaychuk是怎样学习编程的?

    TJ Holowaychuk是怎样学习编程的? 学习了:https://blog.csdn.net/wozaixiaoximen/article/details/49507111 Q:TJ Holow ...

  5. spring boot xml与dao 映射关系

    mybatis的xml路径要和 dao的路径一模一样 dao 用@Mapper 注解

  6. MySQL 的实时性能监控利器

    操作系统及MySQL数据库的实时性能状态数据尤为重要,特别是在有性能抖动的时候,这些实时的性能数据可以快速帮助你定位系统或MySQL数据库的性能瓶颈,就像你在Linux系统上使用「top,sar,io ...

  7. @QueryParam和@PathParam使用方法比较

    1 先来看@queryparam Path("/users") public class UserService { @GET @Path("/query") ...

  8. Angular CLI的安装及使用

    安装命令行 npm install -g @angular/cli 检查命令行 ng v 使用这个命令可以检查 angular cli是否安装成功.我检查的时候发现没有安装成功,提示我使用的node. ...

  9. PHP高级教程-JSON

    PHP JSON 本章节我们将为大家介绍如何使用 PHP 语言来编码和解码 JSON 对象. 环境配置 在 php5.2.0 及以上版本已经内置 JSON 扩展. JSON 函数 函数 描述 json ...

  10. Linux内核结构体--kfifo 环状缓冲区

    转载链接:http://blog.csdn.net/yusiguyuan/article/details/41985907 1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由L ...