lua协程优秀实践:skynet

前言

本文主要讲解 lua 协程的基本使用,和它在 skynet 这个框架中的实际应用。

skynet简介

可能有的读者学 lua 不是做游戏服务器的,没有了解过 skynet,简单介绍下,skynet 是 云风 大神开发的开源服务器引擎,应用于当下众多的游戏公司的服务器框架。

lua协程是什么

从多线程(multithreading)的角度看,协程(coroutine)与线程(thread)类似:协程是一系列的可执行语句,拥有自己的栈、局部变量和指令指针,同时协程又与其他协程共享了全局变量和其他几乎一切资源。线程和协程的主要区别在于,一个多线程程序可以并行运行多个线程,而协程却需要彼此协作地运行,即在任意指定的时刻只能有一个协程运行,且只有当正在运行的协程显式地被挂起(suspend)时其执行才会暂停。
                                   ----《Lua程序设计第四版》

以上这段话摘自《Lua程序设计第四版》,是lua官方指定的入门书籍哦。“协程是一系列的可执行语句,拥有自己的栈、局部变量和指令指针,同时协程又与其他协程共享了全局变量和其他几乎一切资源” 这句话可以这样简单理解下,lua 中的协程对象,即是一个单独的 lua 虚拟机,所以它很容易做到拥有自己的栈,局部变量和指令指针,然后呢,它又是被主虚拟机(就是创建该协程对象的虚拟机)持有的一个对象而已,主虚拟机创建的 n 个协程对象,和其他数据类型(比如函数,table)的对象一样,共享主虚拟机的资源。

常用API介绍

1. 创建协程:

官方手册:
coroutine.create (f)
创建一个主体函数为 f 的新协程。 f 必须是一个 Lua 的函数。 返回这个新协程,它是一个类型为 “thread” 的对象。

该接口传递协程执行的函数体,返回协程对象,并不会执行函数体。当前协程状态为挂起:

local co = coroutine.create(function() print "hello, im a coroutine" end)
print(coroutine.status(co))

输出:
suspended

2. 唤醒协程:

官方手册:
coroutine.resume (co [, val1, ···])
开始或继续协程 co 的运行。 当你第一次延续一个协程,它会从主体函数处开始运行。 val1, … 这些值会以参数形式传入主体函数。 如果该协程被让出,resume 会重新启动它; val1, … 这些参数会作为让出点的返回值。
如果协程运行起来没有错误, resume 返回 true 加上传给 yield 的所有值 (当协程让出), 或是主体函数的所有返回值(当协程中止)。 如果有任何错误发生, resume 返回 false 加错误消息。

  • 开始协程的运行:
      协程刚创建出来,还没有运行过,此时处于 suspended 状态。resume 协程会让主协程进入 normal 状态,进入协程的函数体执行,该函数体执行时,参数为 resume 调用时跟在协程对象后的所有参数,如果执行成功,则函数体的返回值会跟在 true 后面返回给 resume 调用者,执行失败则返回 false 和错误信息。
local add = function(param1, param2)
    return param1 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tobybo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值