worker_core 后台工作线程库
更新时间:2025/06/30
在Gitcode上查看源码由于openUBMC继承了Skynet的异步协程框架,因此在Lua业务编码中,不允许执行阻塞性调用,如驱动、C函数等。但因为部分业务有诉求,因此开发了worker_core
库,通过创建后台线程来完成阻塞操作。
worker_core
通过从当前Lua中启动和管理一个后台线程,并可以从一段Lua代码文本启动或指定的Lua模块启动,当这段代码或模块执行完成则销毁线程。用户不需要对线程的生命周期做额外的管理。
后台线程支持Skynet消息接收队列,通过调用Skynet的消息接口即可以完成线程间的异步交互,消息格式为字符串或二进制,内容由使用者自行决定。
加载方式
lua
local worker_core = require 'worker.core'
local worker = worker_core.new(msg_queue_len); -- 创建后台线程并设置消息队列最大长度,返回代表该线程的对象
主服务册接口说明
worker.start
描述
- 启动后台线程并执行一段Lua代码
WARNING
为了防止命令注入,Lua代码必须写死,且不允许使用string.format
等方式向里拼接动态参数。
如需传入动态参数,请参考worker.send
参数
参数 | 类型 | 描述 | 是否必选 |
---|---|---|---|
code | string | Lua 代码,不允许动态拼接 | 必选 |
返回
- 无
异常
- 加载代码或者创建线程失败,将抛异常
示例
lua
local system_code = [[
local vos = require 'utils.vos'
local json = require 'cjson'
lcoal worker = ...
local cmd = json.decode(worker:recv())
ret = vos.system_s(table.unpack(cmd))
return ret
]]
worker:start(system_code)
worker.start_module
描述
- 从一个 Lua 模块启动后台线程
参数
参数 | 类型 | 描述 | 是否必选 |
---|---|---|---|
module_name | string | Lua 模块,与require 加载方式一致 | 必选 |
返回
- 无
异常
- 若创建线程失败,将抛异常
示例
lua
worker:start_module('bbb.worker') -- 存在bbb/worker.lua,即require 'bbb.worker'找得到文件
worker.stop
描述
- 销毁消息队列并等待后台线程退出。该方法并不会强制终止后台线程,需要后台线程自行退出
参数
- 无
返回
- 无
异常
- 无
示例
lua
local system_code = [[
local vos = require 'utils.vos'
local json = require 'cjson'
lcoal worker = ...
local cmd = json.decode(worker:recv())
ret = vos.system_s(table.unpack(cmd))
return ret
]]
worker:start(system_code)
worker:stop()
worker.send
描述
- 发送消息给后台线程,
block
为true
时消息队列满会阻塞调用,否则队列满返回失败
参数
参数 | 类型 | 描述 | 是否必选 |
---|---|---|---|
msg | string | 消息 | 必选 |
block | boolean | 消息队列满时是否阻塞调用 | 必选 |
返回
- 无
异常
- 若消息为空或者发送消息失败,将抛异常
示例
lua
local system_code = [[
local vos = require 'utils.vos'
local json = require 'cjson'
lcoal worker = ...
local cmd = json.decode(worker:recv())
ret = vos.system_s(table.unpack(cmd))
return ret
]]
worker:start(system_code)
worker:send(usb_id, true)
worker.join
描述
- 阻塞等待后台线程退出
参数
- 无
返回
- 无
异常
- 无
示例
lua
local system_code = [[
local vos = require 'utils.vos'
local json = require 'cjson'
lcoal worker = ...
local cmd = json.decode(worker:recv())
ret = vos.system_s(table.unpack(cmd))
return ret
]]
worker:start(system_code)
worker:join()
worker.is_complete
描述
- 判断后台线程是否退出
参数
- 无
返回
- 判断结果,类型为boolean
异常
- 无
示例
lua
local system_code = [[
while 1 do
...
end
return ret
]]
worker:start(system_code)
local result = worker:is_complete() -- false
worker.quit
描述
- 强制终止后台线程
参数
- 无
返回
- 无
异常
- 无
示例
lua
local system_code = [[
local vos = require 'utils.vos'
local json = require 'cjson'
lcoal worker = ...
local cmd = json.decode(worker:recv())
ret = vos.system_s(table.unpack(cmd))
return ret
]]
worker:start(system_code)
worker:quit()
worker.get_global
描述
- 从工作线程中获取全局变量的值
参数
参数 | 类型 | 描述 | 是否必选 |
---|---|---|---|
name | string | 全局变量名 | 必选 |
返回
- 无
异常
- 若工作线程处于
running
状态,将抛异常 - 若工作线程执行失败,将抛异常
- 若工作线程处于
stopped
状态,将抛异常 - 若
worker
的Lua栈中的空位少于2个,将抛异常 - 若获取全局变量值失败,将抛异常
示例
lua
local result = worker:get_global('name')
后台线程侧接口说明
worker.recv
描述
- 接收消息,没有消息将阻塞
参数
- 无
返回
- 从接受的消息
异常
- 若
l_push_message
出错(如消息格式无效),释放消息内存并通过Lua_error
抛出异常
示例
lua
local msg = worker:recv();
worker.sleep
描述
- 线程
sleep
,单位毫秒
参数
参数 | 类型 | 描述 | 是否必选 |
---|---|---|---|
mill_sec | integer | 线程睡眠毫秒数 | 必选 |
返回
- 无
异常
- 无
示例
lua
worker:sleep(500)
worker.is_running
描述
- 后台线程是否在运行(调用
worker.stop
会置为false
)
参数
- 无
返回
- 判断结果,类型为
boolean
异常
- 无
示例
lua
local result = worker:is_running()
worker.length
描述
- 线程队列长度
参数
- 无
返回
- 队列长度,类型为
integer
异常
- 无
示例
lua
local len = worker:length()