Lua中的协程

http://www.outsky.org/code/lua-coroutine.html

Sep 6, 2014

Lua中的协程和其他变量一样,都是第一类值(first-class alue),可以被保存在变量中,可以被作为参数传递,可以被函数返回。
协程有4种状态:挂起(suspended),运行(running),死亡(dead)和正常(normal)。
Lua为协程提供了3个基础接口:create,resume和yield。

#coroutine.create

  • 创建一个新的协程,并为它的运行分配一个独立的栈
  • 协程处于挂起状态(suspended)
  • 接受一个函数作为参数,这个函数就是协程的主程序块
  • 返回这个协程
  • 挂起点被设置为主程序块的第一句

#coroutine.resume

  • 启动一个协程(第一次启动或从暂停状态启动)
  • 自身(如果是协程的话)处于正常状态,被启动的协程处于运行状态
  • 第一个参数为所要启动的协程
  • 协程从它的挂起点开始执行
  • 一直执行到被挂起或终止
  • 导致协程终止的情况有两种:它的主程序块正常返回、运行过程中出错
  • 执行结束后,控制权递交给此协程被激活的地方

#coroutine.yield

  • 挂起一个协程
  • 协程处于挂起状态
  • 协程的运行状态被记录
  • 激活它的那个coroutine.resume返回

#协程间通信

  • 协程第一次被启动时,传递给coroutine.resume的参数将传递给协程的主程序
  • 协程挂起时,传递给coroutine.yield的参数将作为上次启动它的coroutine.resume的返回值返回
  • 协程被再次启动时,传递给coroutine.resume的参数将作为上次挂起它的coroutine.yield的返回值返回
  • 协程死亡时,主程序返回的值将作为上次启动它的coroutine.resume的返回值返回

#实验

##状态

local function status(str, c)
print(str, coroutine.status(c))
end local c1,c2
c1 = coroutine.create(function()
status("<c2>", c2)
print("before c1 yield")
coroutine.yield()
print("after c1 yield")
end)
c2 = coroutine.create(function()
status("<c2>", c2)
print("before c2 resume c1")
coroutine.resume(c1)
print("after c2 resume c1")
end) status("<c2>", c2)
coroutine.resume(c2)
status("<c1>", c1)
status("<c2>", c2)
coroutine.resume(c1)
status("<c1>", c1)

输出:

outsky@x201:~/tmp$ lua test.lua
<c2> suspended
<c2> running
before c2 resume c1
<c2> normal
before c1 yield
after c2 resume c1
<c1> suspended
<c2> dead
after c1 yield
<c1> dead

##通信

local c = coroutine.create(function(...)
print("c start:", ...)
print("c yield return:", coroutine.yield("c yield"))
return "c dead"
end) print("main start c")
local _,r = coroutine.resume(c, "main start c")
print("main resume return:", r) print("--------") print("main resume c")
_,r = coroutine.resume(c, "main resume c")
print("main resume return again:", r)

输出:

outsky@x201:~/tmp$ lua test.lua
main start c
c start: main start c
main resume return: c yield
--------
main resume c
c yield return: main resume c
main resume return again: c dead

[转]skynet Lua中的协程的更多相关文章

  1. lua中的协程

    lua中的协程和线程类似: 1. 协程拥有自己的独立的栈,局部变量,和指令: 2. 所有协程都可以共享全局变量: 3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程 ...

  2. Unity中的协程(一)

    这篇文章很不错的问题,推荐阅读英文原版: Introduction to Coroutines Scripting with Coroutines   这篇文章转自:http://blog.csdn. ...

  3. 深入tornado中的协程

    tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面 ...

  4. Lua 5.3 协程简单示例

    Lua 5.3 协程简单示例 来源 http://blog.csdn.net/vermilliontear/article/details/50547852 生产者->过滤器->消费者 模 ...

  5. python中的协程及实现

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

  6. fasthttp中的协程池实现

    fasthttp中的协程池实现 协程池可以控制并行度,复用协程.fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池.实现并不复杂,我们可以参考他的设计,写出高性能的应用. ...

  7. Golang 入门系列(六)理解Go中的协程(Goroutine)

    前面讲的都是一些Go 语言的基础知识,感兴趣的朋友可以先看看之前的文章.https://www.cnblogs.com/zhangweizhong/category/1275863.html. 今天就 ...

  8. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

  9. xlua 实现协程替换Unity中的协程

    C#中的协程: IEnumerator ShowSpiritInfo() { UIMessageMgr.ShowMsgWait(true); DestroyUIModelInfo(); bool is ...

随机推荐

  1. 精通Oracle的关键是……(Ask Tom上最经常被问到的问题)(转)

    原文地址:http://www.ituring.com.cn/article/37548 这是我在asktom上最经常收到的问题:我需要怎么做才能变成一个专家呢?关于Oracle,有这样的一个关键事物 ...

  2. HTML5新特性 Web Workers 实现多线程

    引子:(JS单线程) 什么是webworker? Web Worker为Web应用程序提供了一种能在后台中运行的方法.通过Web Worker可以生成多个线程同时运行,并保证页面对用户的及时响应,完全 ...

  3. 连接zookeeper+solr的服务器超时

    在连接zookeeper+solr的服务器超时,如果检查各ip地址都没有变动,各部分工程也没有书写问题,那么连接超时,就可能是该服务器内存分配过少,性能不足的问题,扩大该服务器内存即可.

  4. 【转】Vue 2.0封装axios笔记

    前言 单页面应用大多采用前后端分离开发思路,我们知道,前端和后端交互有多中方式(服务器端渲染.Ajax.websocket等),今天我们主要讲解Ajax部分. 最近团队讨论了一下,Ajax 本身跟 V ...

  5. 微信小程序开发工具 POST net::ERR_PROXY_CONNECTION_FAILED 代理问题

    几天不动代码,再运行成这样了, {errMsg: "getLocation:fail Error: tunneling socket could not…d, cause=connect E ...

  6. 开发Web应用(1)(二十)

    静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /s ...

  7. vue 项目中的坑 在项目中遇到 持续更新ing

    1.vue2.0 不支持 v-html 后绑定的内容使用过滤,可是有时候过滤必须使用-----------解决:通过methods中定义方法 然后 v-html='myMethods(string)' ...

  8. linux网络操作 ifconfig命令

    ifconfig 查看已经被激活的网卡详细信息 "ifconfig eth0" 查看特定的网卡信息 [root@ssgao ~]# ifconfig eth0 eth0 Link ...

  9. Win10系列:UWP界面布局基础8

    路由事件 XAML不仅继承了传统的事件处理方式,还引入了一个增强型事件处理机制:路由事件(RoutedEvent).路由事件和传统事件的不同是:路由事件允许一个对象触发事件后,可以同时拥有多个事件接收 ...

  10. angular 我看过的技术书籍

    13年我在悠唐网络做前端开发时,当时仿豌豆荚一个sdk 发布应用界面的时候,看到代码用到奇怪的ng-,当时查了下是用angular,从那时开始慢慢接触angular,之后进入逸橙官网组使用angula ...