lua中的协程和线程类似:

  1. 协程拥有自己的独立的栈,局部变量,和指令;

  2. 所有协程都可以共享全局变量;

  3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程;

如何使用协程:

  coroutine.create:创建一个协程,返回一个协程句柄;

  coroutine.status:查看一个协程的状态,suspended,running,dead,normal;

  coroutine.resume:恢复一个协程的执行,如果正常就返回true,错误返回false和一条错误信息;

  coroutine.yield:挂起一个协程的执行;

  resume-yield的数据返回:

  例子:

  local co2 = coroutine.create(function(a, b, c)
    return coroutine.yield(a + b, b + c, c + a)
  end)

  print("resume", coroutine.resume(co2, 1, 2, 3)) // 打印 resume true 3 5 4 yield时,返回yield的参数
  print("resume", coroutine.resume(co2, 1, 2, 3)) // 打印 resume true 1 2 3 resume时,返回resume的参数

生产者和消费者实例:

以消费者为驱动,即主循环在消费者,这里有两个消费者,同时向一个生产者获取数据。生产者每产生一个数据就会被挂起,知道下次被消费者激活。

协程程序一旦执行完成,协程状态就会被设置为dead,即死亡状态,如果试图用resume去激活一个死亡状态的协程会出现错误,可以通过判断resume的第一个返回判断协程运行是否正常。

local producer = coroutine.create(function()
local i = ; while true do
i = i + ;
--print(i) coroutine.yield(i)
end
end) function comsumer_func()
local status = data =
while true do
if (data >= ) then
break
end status, data = coroutine.resume(producer)
print("comsumer1:", data) coroutine.yield()
end
end local comsumer1 = coroutine.create(comsumer_func)
local comsumer2 = coroutine.create(comsumer_func)
local comsumers = coroutine.create(function(...)
local threads = {...}
local threads_status = {}
for i, v in ipairs(threads) do
threads_status[i] = true
end while true do
local status = false for i, v in ipairs(threads) do
if (threads_status[i]) then
threads_status[i] = coroutine.resume(threads[i])
end status = status or threads_status[i];
end if (not status) then
break
end
end
end) print(coroutine.resume(comsumers, comsumer1, comsumer2)) print(coroutine.status(producer))
print(coroutine.status(comsumer1))
print(coroutine.status(comsumer2))

排列组合迭代器实例:

function generate(t, i, n)
if (i >= n) then
coroutine.yield(t)
else
for j = i, n do
t[j], t[i] = t[i], t[j];
generate(t, i+, n);
t[j], t[i] = t[i], t[j];
end
end
end function iter(t)
local co = coroutine.create(function()
generate(t, , #t)
end) return function()
local status, data = coroutine.resume(co)
return data
end
end local t = {"a", "b", "c", "e"}
for t in iter(t) do
for j = , #t do
io.write(t[j])
end
io.write("\n")
end

多线程下载文件实例:

require "socket"

function http_get_file(host, file)
local con = assert(socket.connect(host, ))
con:settimeout()
con:send("GET "..file.." HTTP/1.0\r\n\r\n") print("start to download "..file) while true do
local data, status, partial = con:receive()
io.write(data or partial) if status == "timeout" then
--print("timeout")
coroutine.yield(con)
elseif status == "closed" then
print("closed")
break
end
end con:close()
end local download_threads = {} function create_download_task(host, file)
local thread = assert(coroutine.create(function()
http_get_file(host, file)
end)) print("thread", thread) table.insert(download_threads, thread)
end function start_to_download()
local i =
while true do
if (#download_threads == ) then break end if (download_threads[i]) then
local status, con = coroutine.resume(download_threads[i]) if not con then
table.remove(download_threads, i)
i = i -
end
end i = (i + )
if i > #download_threads then
i =
end
end
end create_download_task("news.zol.com.cn", "/591/5916908.html")
create_download_task("www.baidu.com", "/") start_to_download()

lua中的协程的更多相关文章

  1. [转]skynet Lua中的协程

    Lua中的协程 http://www.outsky.org/code/lua-coroutine.html Sep 6, 2014 Lua中的协程和其他变量一样,都是第一类值(first-class ...

  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. 立即调用的函数表达式IIFE

    1.写法 (function () { alert("IIFE");})();//或者(function () { alert("IIFE"); }());

  2. Service中事务不能回滚的解决方式(转)

    1.在service方法里面如果对异常进行了捕获的话,该事务是不会进行回滚的        默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚.          spr ...

  3. Visual Studio 2015 社区版.专业版.企业版[含安装密钥Pro&Ent]

    社区版(Visual Studio Community 2015)可供非企业或开源开发者们免费访问: 在线安装exe:http://download.microsoft.com/download/B/ ...

  4. python3使用requests登录人人影视网站

    python3使用requests登录人人影视网站 继续练习使用requests登录网站,人人影视有一项功能是签到功能,需要每天登录签到才能升级. 下面的代码python代码实现了使用requests ...

  5. JavaScript基础--小案例:在网页指定位置弹出错误信息(十二)

    案例分析:点击按钮后,在网页上指定区域,提示错误信息!5秒后,错误信息提示自动消失! <script languag="javascript" type="text ...

  6. JavaScript基础--简单功能的计算器(十一)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Objective-C学习笔记-第二天(1)

    Objective-C中,调用方法采用的是一种消息传递机制. 参考文章:http://blog.csdn.net/xingyevc/article/details/39397873 如果向某个对象传递 ...

  8. UE4 在C++ 动态生成几何、BSP体、Brush ---- Mesh_Generation

    截至UE4  4.10 runtime 无法生成BSP类 ,只能通过自定义的Mesh的Vertex 进行绘制 ( Google 考证,能改UE4源码的请忽略 ) 可用到的 UE4 集成的Render ...

  9. Boundaries

    Using Third-Party Code There is a natural tension between the provider of an interface and the user ...

  10. node.js之windows下环境终极配置

    大家都知道现在node.js相当流行,出门在外,如果都没听说过node.js,基本上算是out了,前段时间做一个项目,用到了实时通讯功能,当时用的就是node.js来做的,我有幸有研究了一番,别的不敢 ...