lua coroutine(协程)

2018-05-12 10:44:07

协程相关的文章网上有很多,众说纷坛,相比其他技术概念理解起来没那么直接。因为协程涉及了很多底层高并发概念,没接触过操作系统调度,C语言等底层知识根本不可能完全理解。

备注:以下我说的单进程就是指一个进程一个主线程

1.协程跟linux c里的epoll很像,都是单进程非阻塞的(也就是没有io等待,单核cpu利用率可以达到100%)

2.由于协程是单进程的所以没有存在像多线程多核cpu下的竞争关系

3.线程有抢占式和非抢占之说,而协程没有这一说,全部由你手动控制什么时候释放

4.协程的缺点是只能利用cpu的一个核,类似于node.js,想利用多核cpu得使用其他分布式技术


co = coroutine.create(func)

创建协程并返回


stat,data = coroutine.resume(co, 1)

启动协程并传入参数,当协程遇到yield时返回数据


stat = coroutine.status(co)

返回携程状态dead,suspend,running


coroutine.yield(x)

挂起协程并返回x到上面的data


coroutine.running()

返回正在运行的线程号


coroutine.wrap()

另一种启动协程的方法
co = coroutine.wrap(
    function(i)
        print(i);
    end
)
--调用方法传入参数自动启动
co(1)



以下附上一个简单的例子,目前还没有在现实项目中用到协程,以后用到了再补充

跟着下标从0-5依次读下去应该就能懂

--例子---以下程序由1-5一直循环
local newProductor

function productor()
     local i = 0
     while true do
          i = i + 1
          send(i)     --3
     end
end

function consumer()
     while true do
          local i = receive() --1
          print(i)
     end
end

function receive()
    --启动携程调用productor()
    local status, value = coroutine.resume(newProductor)   --2,5
    return value
end

function send(x)
    --挂起携程 返回到resume的地方
    coroutine.yield(x)     --4
end

-- 启动程序
newProductor = coroutine.create(productor)
consumer()    --0


总结

1.本文只是对lua协程做简单的介绍,如果有疑问可以给我留言
2.lua的版本为5.1,运行环境centos7 64位
3.原文地址http://www.freecls.com/a/2712/1c

©著作权归作者所有
收藏
推荐阅读
  • lua模拟面向对象编程

    lua中跟对象和类最像的就是表格有方法和属性,所以类和对象都只能用表格来模拟声明一下,其实表格的功能已经能应付大部分场景了,而且lua脚本语言本就不是面向对象语言(它的优势是轻量级简单快速),硬要模拟...

  • lua元表

    lua元表其实就是为了扩展表格间的运算,比如之前我们如果让2个表格相加就会报错,一旦我们设置了元表并加上了__add属性,那么就会正常执行。先看2个元表相关的函数setmetatable(table,...

  • lua模块编写

    lua允许我们编写自定义模块以便后面调用,在编写模块之前我们先认识2个知识点1.lua语言中数组,模块其实都是table表格。2.在之前的lua基本语法里我们知道函数是可以赋值给变量的好,我们新建一个...

  • lua基本语法

    变量1.变量无需声明2.变量没声明为nil,赋值为nil等同于删除3.lua把nil,false视为假,其他都为true4.Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显...

  • lua基础函数 type,tonumber,tostring,pcall,print

    type(v)用来判断v的类型返回字符串"nil", "number", "string", "boolean", "table", "function", "thread", "userdata"t...

  • nginx模块 ngx_http_headers_module

    ngx_http_headers_module 模块是用来增加 Expires 和 Cache-control,或者是任意的响应头。Syntax: add_header name value [alw...

  • nginx模块 ngx_http_gunzip_module、ngx_http_gzip_module、ngx_http_gzip_static_module

    ngx_http_gunzip_module 模块将文件解压缩后并在响应头加上 "Content-Encoding: gzip" 返回给客户端。为了解决客户端不支持gzip压缩。编译的时候带上 --w...

  • nginx模块 ngx_http_flv_module、ngx_http_mp4_module

    ngx_http_flv_module模块提供了对 flv 视频的伪流支持。编译的时候带上 --with-http_flv_module。它会根据指定的 start 参数来指定跳过多少字节,并在返回数...

  • nginx模块 ngx_http_fastcgi_module

    ngx_http_fastcgi_module 模块使得nginx可以与 fastcgi 服务器通信。比如目前要使得 nginx 支持 php 就得使用 fastcgi技术,在服务器上装上 nginx...

  • nginx模块 ngx_http_autoindex_module

    ngx_http_autoindex_module 模块可以将uri以 / 结尾时,列出里面的文件和目录。Syntax: autoindex on | off; Default: autoindex ...

简介
天降大任于斯人也,必先苦其心志。