Ir al contenido

Runtime de Lua

El runtime de computación principal de Wippy optimizado para cargas de trabajo de I/O y lógica de negocio. El código se ejecuta en procesos aislados que se comunican mediante paso de mensajes, sin memoria compartida ni bloqueos.

Wippy está diseñado como un runtime políglota. Aunque Lua es el lenguaje principal, versiones futuras soportarán lenguajes adicionales a través de WebAssembly e integración con Temporal para cargas de trabajo intensivas en cómputo o especializadas.

Su código Lua se ejecuta dentro de procesos, contextos de ejecución aislados gestionados por el planificador. Cada proceso:

  • Tiene su propio espacio de memoria
  • Cede el control en operaciones bloqueantes (I/O, canales)
  • Puede ser monitoreado y supervisado
  • Escala a miles por máquina
Un proceso Lua típico tiene una sobrecarga de memoria base de aproximadamente 13 KB.
local pid = process.spawn("app.workers:handler", "app:processes")
process.send(pid, "task", {data = "work"})

Consulte Gestión de Procesos para creación, enlace y supervisión.

Canales estilo Go para comunicación:

local ch = channel.new() -- sin buffer
local buffered = channel.new(10)
ch:send(value) -- bloquea hasta que se reciba
local val, ok = ch:receive() -- bloquea hasta que esté listo

Consulte Canales para select y patrones.

Dentro de un proceso, cree corrutinas ligeras:

coroutine.spawn(function()
local data = fetch_data()
ch:send(data)
end)
do_other_work() -- continúa inmediatamente

Las corrutinas creadas son gestionadas por el planificador, sin yield/resume manual.

Maneje múltiples fuentes de eventos:

local r = channel.select {
inbox:case_receive(),
events:case_receive(),
timeout:case_receive()
}
if r.channel == timeout then
-- tiempo agotado
elseif r.channel == events then
handle_event(r.value)
else
handle_message(r.value)
end

Estos están siempre disponibles sin require y no necesitan aparecer en modules::

  • process - crear procesos, enviar mensajes, monitorear y enlazar
  • channel - canales estilo Go
  • payload - el payload de entrada del entry
  • print, subscribe, unsubscribe - logging y pub/sub
  • os, table, math, string, coroutine, errors - bibliotecas estándar

Todo lo demás se carga con require() y debe aparecer en la lista de permitidos modules: del entry:

local json = require("json")
local sql = require("sql")
local http = require("http_client")

Los módulos disponibles dependen de la configuración de entrada. Consulte Definiciones de Entrada.

Wippy usa sintaxis Lua 5.3 con un sistema de tipos gradual inspirado en Luau. Los tipos son valores de primera clase en tiempo de ejecución, invocables para validación, pasables como argumentos e introspectables, reemplazando la necesidad de bibliotecas de esquemas como Zod o Pydantic.

Las bibliotecas Lua externas (LuaRocks, etc.) no están soportadas. El runtime proporciona su propio sistema de módulos con extensiones incorporadas para I/O, redes e integración de sistema.

Para extensiones personalizadas, consulte Módulos en la documentación de internos.

Las funciones devuelven pares resultado, error:

local data, err = json.decode(input)
if err then
return nil, errors.wrap(err, "decode failed")
end

Consulte Manejo de Errores para patrones.