lua coroutine(协程)

原文地址http://www.daileinote.com/computer/lua/15

协程相关的文章网上有很多,众说纷坛,相比其他技术概念理解起来没那么直接。因为协程涉及了很多底层高并发概念,没接触过操作系统调度,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.daileinote.com/computer/lua/15

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值