Futures
Futures
Seção intitulada “Futures”Resultados de operações assíncronas. Futures sao retornados por funcs.async() e chamadas async de contract.
Carregamento
Seção intitulada “Carregamento”Não e um módulo carregavel. Futures sao criados por operações assíncronas:
local funcs = require("funcs")local future, err = funcs.async("app.compute:task", data)Channel de Resposta
Seção intitulada “Channel de Resposta”Obter channel para receber resultado:
local ch = future:response()local payload, ok = ch:receive()if ok then local result = payload:data()endchannel() e um alias para response().
Verificação de Conclusao
Seção intitulada “Verificação de Conclusao”Verificação não-bloqueante se future completou:
if future:is_complete() then local result, err = future:result()endVerificação de Cancelamento
Seção intitulada “Verificação de Cancelamento”Verificar se cancel() foi chamado:
if future:is_canceled() then print("Operation was canceled")endObtendo Resultado
Seção intitulada “Obtendo Resultado”Obter resultado em cache (não-bloqueante):
local val, err = future:result()Retorna:
- Não completo:
nil, nil - Cancelado:
nil, error(tipoCANCELED) - Erro:
nil, error - Sucesso:
Payload, niloutable, nil(multiplos payloads)
Obtendo Erro
Seção intitulada “Obtendo Erro”Obter erro se future falhou:
local err, has_error = future:error()if has_error then print("Failed:", err:message())endRetorna: error, boolean
Cancelando
Seção intitulada “Cancelando”Cancelar operação assíncrona (best-effort):
future:cancel()A operação ainda pode completar se ja estiver em andamento.
Padrão de Timeout
Seção intitulada “Padrão 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()Primeiro a Completar
Seção intitulada “Primeiro a 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 o mais lentoif r.channel == f1:channel() then f2:cancel()else f1:cancel()end
return r.value:data()| Condição | Tipo |
|---|---|
| Operação cancelada | CANCELED |
| Operação async falhou | varia |