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

参数

参数类型描述是否必选
codestringLua 代码,不允许动态拼接必选

返回

异常

  • 加载代码或者创建线程失败,将抛异常

示例

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_namestringLua 模块,与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

描述

  • 发送消息给后台线程,blocktrue时消息队列满会阻塞调用,否则队列满返回失败

参数

参数类型描述是否必选
msgstring消息必选
blockboolean消息队列满时是否阻塞调用必选

返回

异常

  • 若消息为空或者发送消息失败,将抛异常

示例

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

描述

  • 从工作线程中获取全局变量的值

参数

参数类型描述是否必选
namestring全局变量名必选

返回

异常

  • 若工作线程处于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_secinteger线程睡眠毫秒数必选

返回

异常

示例

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()