跳转到内容

进程管理

启动、监控子进程并与之通信。实现带消息传递、监督和生命周期管理的 Actor 模型模式。

全局变量 process 始终可用——无需 require(),也不需要列在 modules: 中。

获取当前帧 ID 或进程 ID:

local frame_id = process.id() -- 调用链标识符
local pid = process.pid() -- 进程 ID

通过 PID 或注册名称向进程发送消息:

local ok, err = process.send(destination, topic, ...)
参数类型描述
destinationstringPID 或注册名称
topicstring主题名称(不能以 @ 开头)
...any负载值

权限: 目标 PID 上的 process.send

-- 基本启动
local pid, err = process.spawn(id, host, ...)
-- 带监控(接收 EXIT 事件)
local pid, err = process.spawn_monitored(id, host, ...)
-- 带链接(异常退出时接收 LINK_DOWN)
local pid, err = process.spawn_linked(id, host, ...)
-- 同时链接和监控
local pid, err = process.spawn_linked_monitored(id, host, ...)
参数类型描述
idstring进程源 ID(如 "app.workers:handler"
hoststring主机 ID(如 "app:processes"
...any传递给启动进程的参数

权限:

  • 进程 id 上的 process.spawn
  • 主机 id 上的 process.host
  • 进程 id 上的 process.spawn.monitored(用于监控变体)
  • 进程 id 上的 process.spawn.linked(用于链接变体)
-- 强制终止进程
local ok, err = process.terminate(destination)
-- 请求优雅取消,可附带可选原因
local ok, err = process.cancel(destination, "shutting down")
参数类型描述
destinationstringPID 或注册名称
reasonstring传递给目标的可选原因

权限: 目标 PID 上的 process.terminateprocess.cancel

监控或链接到现有进程:

-- 监控:目标退出时接收 EXIT 事件
local ok, err = process.monitor(destination)
local ok, err = process.unmonitor(destination)
-- 链接:双向,异常退出时接收 LINK_DOWN
local ok, err = process.link(destination)
local ok, err = process.unlink(destination)

权限: 目标 PID 上的 process.monitorprocess.unmonitorprocess.linkprocess.unlink

local options = process.get_options()
local ok, err = process.set_options({trap_links = true})
字段类型描述
trap_linksbooleanLINK_DOWN 事件是否传递到事件通道

获取接收消息和生命周期事件的通道:

local inbox = process.inbox() -- 来自 @inbox 主题的消息对象
local events = process.events() -- 来自 @events 主题的生命周期事件
常量描述
process.event.CANCEL请求取消
process.event.EXIT被监控进程退出
process.event.LINK_DOWN链接进程异常终止
字段类型描述
kindstring事件类型常量
fromstring源 PID
resultanyEXIT 时:返回的值(正常退出时存在)
erroranyEXIT 时:错误(异常退出时存在)
reasonstringCANCEL 时:进程被取消的原因

订阅自定义主题:

local ch = process.listen(topic, options)
process.unlisten(ch)
参数类型描述
topicstring主题名称(不能以 @ 开头)
options.messageboolean若为 true,接收 Message 对象;若为 false,接收原始负载

从收件箱接收或使用 {message = true} 时:

local msg = inbox:receive()
msg:topic() -- string: 主题名称
msg:from() -- string|nil: 发送方 PID
msg:payload() -- Payload: 包装器(调用 :data() 提取)
msg:payload():data() -- any: 实际负载值

启动进程,等待其结果并返回:

local result, err = process.exec(id, host, ...)

权限: 进程 id 上的 process.exec,主机 id 上的 process.host

升级当前进程到新定义同时保留 PID:

-- 升级到新版本,传递状态
process.upgrade(id, ...)
-- 保持相同定义,用新状态重新运行
process.upgrade(nil, preserved_state)

创建带自定义上下文的子进程启动器:

local spawner = process.with_context({request_id = "123"})

权限: “context” 上的 process.context

process.with_options(options) 创建一个携带启动时选项(如网络选择器)而非上下文值的启动器:

local spawner = process.with_options({network = "app:tor_proxy"})
选项类型描述
networkstring用于子进程出站连接的 network.* 条目的注册表 ID

权限: “context” 上的 process.context;选择网络还需要在该网络 ID 上的 network.select

SpawnBuilder 是不可变的——每个方法返回新实例:

spawner:with_context(values) -- 添加上下文值
spawner:with_actor(actor) -- 设置安全 actor
spawner:with_scope(scope) -- 设置安全作用域
spawner:with_name(name) -- 设置进程名称
spawner:with_message(topic, ...) -- 排队启动后发送的消息
spawner:with_options(options) -- 合并启动时选项(如 network)

权限::with_actor():with_scope(),需要 “security” 上的 process.security

spawner:spawn(id, host, ...)
spawner:spawn_monitored(id, host, ...)
spawner:spawn_linked(id, host, ...)
spawner:spawn_linked_monitored(id, host, ...)

与模块级 spawn 函数权限相同。

以名称注册进程,通过名称而非 PID 访问它。任何接受 destination 参数的函数(sendterminatecancelmonitorlink 等)都可以接受注册名称代替 PID。

local ok, err = process.registry.register(name) -- 自身,本地作用域
local pid, err = process.registry.lookup(name)
local ok, err = process.registry.unregister(name)

可选的 scope 参数选择名称的一致性保障。默认为 LOCAL。四种作用域及其保障在集群指南中有详细说明;简要说明:

常量可见性保障
process.registry.LOCAL仅此节点即时,节点本地
process.registry.EVENTUAL集群范围最终一致(gossip)
process.registry.CONSISTENT集群范围线性化单例(Raft)
process.registry.STRONG集群范围一致 + 所有存活节点确认

在独立节点上只有 LOCAL 有意义;集群作用域需要启用集群

local ok, err = process.registry.register(name, pid, scope)
参数类型必填默认值描述
namestring要注册的名称
pidstring自身要注册的 PID;默认为调用进程
scopenumberLOCAL上述作用域常量之一

成功返回 true,失败返回 nil, error。冲突(名称在集群作用域下已注册给不同 PID)返回 errors.ALREADY_EXISTS。将同一名称注册给同一 PID 是幂等的。STRONG 注册会阻塞,直到所有存活节点确认或预留截止时间到期;超时返回错误。

代表不同 PID 注册时,还需要在目标 PID 上的 process.registry.foreign 权限。

local pid, err = process.registry.lookup(name)

返回已注册的 PID 字符串,或在名称未注册时返回 nil, error(类型为 errors.NOT_FOUND)。

local ok, err = process.registry.unregister(name, scope)

scope 默认为 LOCAL,必须与注册时使用的作用域匹配。对于 CONSISTENTSTRONG,拥有进程才能注销;注销另一个 PID 拥有的名称返回 false。当拥有进程退出时(以及对于集群作用域,当其节点离开时),名称也会自动释放,因此显式注销仅用于提前释放。

权限控制调用进程可以做什么。所有检查使用调用方的安全上下文(actor)针对目标资源。

策略可基于以下内容允许/拒绝:

  • Actor: 发起请求的安全主体
  • Action: 正在执行的操作(如 process.send
  • Resource: 目标(PID、进程 id、主机 id 或名称)
  • Attributes: 附加上下文,包括 pid(调用方的进程 ID)
权限函数资源
process.spawnspawn*()进程 id
process.spawn.monitoredspawn_monitored()spawn_linked_monitored()进程 id
process.spawn.linkedspawn_linked()spawn_linked_monitored()进程 id
process.hostspawn*()exec()主机 id
process.sendsend()目标 PID
process.execexec()进程 id
process.terminateterminate()目标 PID
process.cancelcancel()目标 PID
process.monitormonitor()目标 PID
process.unmonitorunmonitor()目标 PID
process.linklink()目标 PID
process.unlinkunlink()目标 PID
process.contextwith_context()”context”
process.security:with_actor():with_scope()”security”
process.registry.registerregistry.register()名称
process.registry.unregisterregistry.unregister()名称
process.registry.foreignregistry.register()目标 PID

集群名称作用域通过这些操作的作用域后缀变体授权(process.registry.register.eventual.consistent.strong 以及对应的 unregister 操作),策略可以单独授予本地命名和集群范围命名权限。

某些操作需要多个权限:

操作所需权限
spawn()process.spawn + process.host
spawn_monitored()process.spawn + process.spawn.monitored + process.host
spawn_linked()process.spawn + process.spawn.linked + process.host
spawn_linked_monitored()process.spawn + process.spawn.monitored + process.spawn.linked + process.host
exec()process.exec + process.host
使用自定义 actor/scope 启动spawn 权限 + process.security
条件类型
未找到上下文errors.INVALID
未找到帧上下文errors.INVALID
缺少必需参数errors.INVALID
保留主题前缀(@errors.INVALID
无效时长格式errors.INVALID
名称未注册errors.NOT_FOUND
权限被拒绝errors.PERMISSION_DENIED
名称已注册errors.ALREADY_EXISTS

错误处理参见错误处理