Gestión de Procesos
Crear, monitorear y comunicarse con procesos hijos. Implementa patrones de modelo de actores con paso de mensajes, supervision y gestión de ciclo de vida.
El global process siempre esta disponible.
Información de Proceso
Obtener el ID de frame actual o ID de proceso:
local frame_id = process.id() -- Identificador de cadena de llamadas
local pid = process.pid() -- ID de proceso
Enviar Mensajes
Enviar mensaje(s) a un proceso por PID o nombre registrado:
local ok, err = process.send(destination, topic, ...)
| Parámetro | Tipo | Descripción |
|---|---|---|
destination |
string | PID o nombre registrado |
topic |
string | Nombre de topico (no puede comenzar con @) |
... |
any | Valores de carga |
Permiso: process.send en PID objetivo
Crear Procesos
-- Creacion basica
local pid, err = process.spawn(id, host, ...)
-- Con monitoreo (recibir eventos EXIT)
local pid, err = process.spawn_monitored(id, host, ...)
-- Con enlace (recibir LINK_DOWN en salida anormal)
local pid, err = process.spawn_linked(id, host, ...)
-- Ambos enlazado y monitoreado
local pid, err = process.spawn_linked_monitored(id, host, ...)
| Parámetro | Tipo | Descripción |
|---|---|---|
id |
string | ID de fuente de proceso (ej., "app.workers:handler") |
host |
string | ID de host (ej., "app:processes") |
... |
any | Argumentos pasados al proceso creado |
Permisos:
process.spawnen id de procesoprocess.hosten id de hostprocess.spawn.monitoreden id de proceso (para variantes monitoreadas)process.spawn.linkeden id de proceso (para variantes enlazadas)
Control de Proceso
-- Terminar forzosamente un proceso
local ok, err = process.terminate(destination)
-- Solicitar cancelacion gradual con fecha limite opcional
local ok, err = process.cancel(destination, "5s")
| Parámetro | Tipo | Descripción |
|---|---|---|
destination |
string | PID o nombre registrado |
deadline |
string|integer | Cadena de duración o milisegundos |
Permisos: process.terminate, process.cancel en PID objetivo
Monitoreo y Enlace
Monitorear o enlazar a un proceso existente:
-- Monitoreo: recibir eventos EXIT cuando el objetivo termina
local ok, err = process.monitor(destination)
local ok, err = process.unmonitor(destination)
-- Enlace: bidireccional, recibir LINK_DOWN en salida anormal
local ok, err = process.link(destination)
local ok, err = process.unlink(destination)
Permisos: process.monitor, process.unmonitor, process.link, process.unlink en PID objetivo
Opciones de Proceso
local options = process.get_options()
local ok, err = process.set_options({trap_links = true})
| Campo | Tipo | Descripción |
|---|---|---|
trap_links |
boolean | Si los eventos LINK_DOWN se entregan al canal de eventos |
Inbox y Eventos
Obtener canales para recibir mensajes y eventos de ciclo de vida:
local inbox = process.inbox() -- Objetos Message del topico @inbox
local events = process.events() -- Eventos de ciclo de vida del topico @events
Tipos de Evento
| Constante | Descripción |
|---|---|
process.event.CANCEL |
Cancelacion solicitada |
process.event.EXIT |
Proceso monitoreado termino |
process.event.LINK_DOWN |
Proceso enlazado termino anormalmente |
Campos de Evento
| Campo | Tipo | Descripción |
|---|---|---|
kind |
string | Constante de tipo de evento |
from |
string | PID de origen |
result |
table | Para EXIT: {value: any} o {error: string} |
deadline |
string | Para CANCEL: timestamp de fecha limite |
Suscripcion a Topico
Suscribirse a topicos personalizados:
local ch = process.listen(topic, options)
process.unlisten(ch)
| Parámetro | Tipo | Descripción |
|---|---|---|
topic |
string | Nombre de topico (no puede comenzar con @) |
options.message |
boolean | Si true, recibe objetos Message; si false, cargas crudas |
Objetos Message
Al recibir de inbox o con {message = true}:
local msg = inbox:receive()
msg:topic() -- string: nombre de topico
msg:from() -- string|nil: PID del remitente
msg:payload() -- any: datos de carga
Llamada Sincrona
Crear un proceso, esperar su resultado y retornar:
local result, err = process.exec(id, host, ...)
Permisos: process.exec en id de proceso, process.host en id de host
Actualizacion de Proceso
Actualizar el proceso actual a una nueva definicion mientras preserva PID:
-- Actualizar a nueva versión, pasando estado
process.upgrade(id, ...)
-- Mantener misma definicion, re-ejecutar con nuevo estado
process.upgrade(nil, preserved_state)
Creador con Contexto
Crear un creador con contexto personalizado para procesos hijos:
local spawner = process.with_context({request_id = "123"})
Permiso: process.context en "context"
Metodos de SpawnBuilder
SpawnBuilder es inmutable - cada método devuelve una nueva instancia:
spawner:with_context(values) -- Agregar valores de contexto
spawner:with_actor(actor) -- Establecer actor de seguridad
spawner:with_scope(scope) -- Establecer alcance de seguridad
spawner:with_name(name) -- Establecer nombre de proceso
spawner:with_message(topic, ...) -- Encolar mensaje para enviar despues de crear
Permiso: process.security en "security" para :with_actor() y :with_scope()
Metodos Spawn de Creador
spawner:spawn(id, host, ...)
spawner:spawn_monitored(id, host, ...)
spawner:spawn_linked(id, host, ...)
spawner:spawn_linked_monitored(id, host, ...)
Mismos permisos que funciones spawn a nivel de módulo.
Registro de Nombres
Registrar y buscar procesos por nombre:
local ok, err = process.registry.register(name, pid) -- pid por defecto es self
local pid, err = process.registry.lookup(name)
local ok = process.registry.unregister(name)
Permisos: process.registry.register, process.registry.unregister en nombre
Permisos
Los permisos controlan lo que un proceso llamador puede hacer. Todas las verificaciones usan el contexto de seguridad del llamador (actor) contra el recurso objetivo.
Evaluacion de Politica
Las politicas pueden permitir/denegar basado en:
- Actor: El principal de seguridad haciendo la solicitud
- Accion: La operación siendo realizada (ej.,
process.send) - Recurso: El objetivo (PID, id de proceso, id de host o nombre)
- Atributos: Contexto adicional incluyendo
pid(ID de proceso del llamador)
Referencia de Permisos
| Permiso | Funciones | Recurso |
|---|---|---|
process.spawn |
spawn*() |
id de proceso |
process.spawn.monitored |
spawn_monitored(), spawn_linked_monitored() |
id de proceso |
process.spawn.linked |
spawn_linked(), spawn_linked_monitored() |
id de proceso |
process.host |
spawn*(), call() |
id de host |
process.send |
send() |
PID objetivo |
process.exec |
call() |
id de proceso |
process.terminate |
terminate() |
PID objetivo |
process.cancel |
cancel() |
PID objetivo |
process.monitor |
monitor() |
PID objetivo |
process.unmonitor |
unmonitor() |
PID objetivo |
process.link |
link() |
PID objetivo |
process.unlink |
unlink() |
PID objetivo |
process.context |
with_context() |
"context" |
process.security |
:with_actor(), :with_scope() |
"security" |
process.registry.register |
registry.register() |
nombre |
process.registry.unregister |
registry.unregister() |
nombre |
Permisos Multiples
Algunas operaciones requieren multiples permisos:
| Operación | Permisos Requeridos |
|---|---|
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 |
call() |
process.exec + process.host |
| crear con actor/scope personalizado | permisos spawn + process.security |
Errores
| Condición | Tipo |
|---|---|
| Contexto no encontrado | errors.INVALID |
| Contexto de frame no encontrado | errors.INVALID |
| Argumentos requeridos faltantes | errors.INVALID |
Prefijo de topico reservado (@) |
errors.INVALID |
| Formato de duración invalido | errors.INVALID |
| Nombre no registrado | errors.NOT_FOUND |
| Permiso denegado | errors.PERMISSION_DENIED |
| Nombre ya registrado | errors.ALREADY_EXISTS |
Consulte Manejo de Errores para trabajar con errores.
Vea También
- Canales - Comunicación entre procesos
- Cola de Mensajes - Mensajeria basada en colas
- Funciones - Invocacion de funciones
- Supervision - Gestión de ciclo de vida de procesos