前言
本文主要讲解 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

最低0.47元/天 解锁文章
1093

被折叠的 条评论
为什么被折叠?



