框架简述
LuaTask框架,利用协程,在Lua中实现了多任务功能。开发者可以用最简单的方式,新建多个任务,而不是像传统的开发方式一样,只能用定时器进行延时。
当使用LuaTask框架时,需要在代码中引用sys库(_G.sys=require(“sys”)),并且在代码的最后一行,调用sys.run()以启动LuaTask框架,框架内的任务代码会在sys.run()中运行。
线上运行lua程序
给大家介绍一个可以线上测试lua的地址,点击:线上lua测试
–此处为纯lua5.3测试场地
–同时,支持加载sys库,使用task框架特性
下面的例子就在线上测试,比较方便
一、多任务
例:
sys = require("sys")
--第一个任务
sys.taskInit(function()
while true do
log.info("task1","heihei")
sys.wait(1000) --延时1秒,这段时间里可以运行其他代码
end
end)
--第二个任务
sys.taskInit(function()
while true do
log.info("task2","haha")
sys.wait(500) --延时0.5秒,这段时间里可以运行其他代码
end
end)
sys.run()
二、多任务之间互相等待
例:
sys = require("sys")
--第一个任务
sys.taskInit(function()
while true do
log.info("task1","wow")
sys.wait(1000) --延时1秒,这段时间里可以运行其他代码
sys.publish("TASK1_DONE")--发布这个消息,此时所有在等的都会收到这条消息
end
end)
--第二个任务
sys.taskInit(function()
while true do
sys.waitUntil("TASK1_DONE")--等待这个消息,这个任务阻塞在这里了
log.info("task2","wow")
end
end)
--第三个任务
sys.taskInit(function()
while true do
local result = sys.waitUntil("TASK1_DONE",500)--等待超时时间500ms,超过就返回false而且不等了
log.info("task3","wait result",result)
end
end)
--单独订阅,可以当回调来用
sys.subscribe("TASK1_DONE",function()
log.info("subscribe","wow")
end)
sys.run()
先运行第一个任务延时一秒,第二个任务和第三个任务都没收到消息发布,所以阻塞在这样(三个任务都是同步运行的,我说的阻塞是指 sys.waitUntil这个函数)
第二个任务等待500ms没有消息发布,直接返回false不等了,执行后面代码
第三个任务没有等待时间,在消息发布之前会一直阻塞,直到等到消息发布,第一个任务在延时1s后发布消息,第三个任务的 sys.waitUntil 接收到了消息,开始执行后面的代码
sys.subscribe也订阅了"subscribe",所以第一个任务延时一秒后发布"subscribe"消息, sys.subscribe也会执行。
- sys.taskInit 可以简单理解为多线程,如果不懂的可以这样理解,我刚学的时候就是这样理解的,但不完全等于
三、多任务之间互相等待并传递数据
例:
sys = require("sys")
--第一个任务
sys.taskInit(function()
while true do
log.info("task1","heihei")
sys.wait(1000) --延时1秒,这段时间里可以运行其他代码
sys.publish("TASK1_DONE","balabala")--发布这个消息,并且带上一个数据
end
end)
--第二个任务
sys.taskInit(function()
while true do
local result,data = sys.waitUntil("TASK1_DONE")--等待这个消息,这个任务阻塞在这里了
log.info("task2","haha receive",data)
end
end)
--第三个任务
sys.taskInit(function()
while true do
local result,data = sys.waitUntil("TASK1_DONE",500)--等待超时时间500ms,超过就返回false而且不等了
log.info("task3","wait result",result,data)
end
end)
--单独订阅,可以当回调来用
sys.subscribe("TASK1_DONE",function(data)
log.info("subscribe","heihei receive",data)
end)
sys.run()
这个例子只是在例二的 sys.publish 发布消息时附带了一条数据
四、传统定时器
例:
sys = require("sys")
--一秒后执行某函数,可以在后面传递参数
sys.timerStart(log.info,1000,"1s timer")
--之间写个function也行
sys.timerStart(function()
log.info("1s timer function")
end,1000)
--每秒执行,永久循环,返回定时器编号
local loopId = sys.timerLoopStart(log.info,1000,"1s loop timer")
--10秒后手动停止上面的无限循环定时器
sys.timerStart(function()
sys.timerStop(loopId)
log.info("stop 1s loop timer")
end,10000)
sys.run()