Futures
Futures
Sección titulada «Futures»Resultados de operaciones asincronas. Los futures son devueltos por funcs.async() y llamadas async de contrato.
No es un módulo cargable. Los futures son creados por operaciones asincronas:
local funcs = require("funcs")local future, err = funcs.async("app.compute:task", data)Canal de Respuesta
Sección titulada «Canal de Respuesta»Obtener canal para recibir resultado:
local ch = future:response()local payload, ok = ch:receive()if ok then local result = payload:data()endchannel() es un alias para response().
Verificacion de Completitud
Sección titulada «Verificacion de Completitud»Verificacion no bloqueante si el future completo:
if future:is_complete() then local result, err = future:result()endVerificacion de Cancelacion
Sección titulada «Verificacion de Cancelacion»Verificar si cancel() fue llamado:
if future:is_canceled() then print("Operation was canceled")endObtener Resultado
Sección titulada «Obtener Resultado»Obtener resultado cacheado (no bloqueante):
local val, err = future:result()Devuelve:
- No completo:
nil, nil - Cancelado:
nil, error(tipoCANCELED) - Error:
nil, error - Exito:
Payload, nilotable, nil(multiples payloads)
Obtener Error
Sección titulada «Obtener Error»Obtener error si el future fallo:
local err, has_error = future:error()if has_error then print("Failed:", err:message())endDevuelve: error, boolean
Cancelar
Sección titulada «Cancelar»Cancelar operación asincrona (mejor esfuerzo):
future:cancel()La operación puede aun completarse si ya esta en progreso.
Patrón de Timeout
Sección titulada «Patrón de Timeout»local future = funcs.async("app.compute:slow", data)local timeout = time.after("5s")
local r = channel.select { future:channel():case_receive(), timeout:case_receive()}
if r.channel == timeout then future:cancel() return nil, errors.new("TIMEOUT", "Operation timed out")end
return r.value:data()Primero en Completar
Sección titulada «Primero en Completar»local f1 = funcs.async("app.cache:get", key)local f2 = funcs.async("app.db:get", key)
local r = channel.select { f1:channel():case_receive(), f2:channel():case_receive()}
-- Cancelar el mas lentoif r.channel == f1:channel() then f2:cancel()else f1:cancel()end
return r.value:data()Errores
Sección titulada «Errores»| Condición | Tipo |
|---|---|
| Operación cancelada | CANCELED |
| Operación asincrona fallida | varia |