Futures
Futures
Abschnitt betitelt „Futures“Asynchrone Operationsergebnisse. Futures werden von funcs.async() und asynchronen Contract-Aufrufen zurückgegeben.
Kein ladbares Modul. Futures werden von asynchronen Operationen erstellt:
local funcs = require("funcs")local future, err = funcs.async("app.compute:task", data)Response-Channel
Abschnitt betitelt „Response-Channel“Channel zum Empfangen des Ergebnisses holen:
local ch = future:response()local payload, ok = ch:receive()if ok then local result = payload:data()endchannel() ist ein Alias für response().
Abschlussprüfung
Abschnitt betitelt „Abschlussprüfung“Nicht-blockierende Prüfung, ob Future abgeschlossen ist:
if future:is_complete() then local result, err = future:result()endAbbruchprüfung
Abschnitt betitelt „Abbruchprüfung“Prüfen, ob cancel() aufgerufen wurde:
if future:is_canceled() then print("Operation was canceled")endErgebnis holen
Abschnitt betitelt „Ergebnis holen“Zwischengespeichertes Ergebnis holen (nicht-blockierend):
local val, err = future:result()Gibt zurück:
- Nicht abgeschlossen:
nil, nil - Abgebrochen:
nil, error(ArtCANCELED) - Fehler:
nil, error - Erfolg:
Payload, nilodertable, nil(mehrere Payloads)
Fehler holen
Abschnitt betitelt „Fehler holen“Fehler holen, wenn Future fehlgeschlagen ist:
local err, has_error = future:error()if has_error then print("Failed:", err:message())endGibt zurück: error, boolean
Abbrechen
Abschnitt betitelt „Abbrechen“Asynchrone Operation abbrechen (Best-Effort):
future:cancel()Operation kann trotzdem abgeschlossen werden, wenn bereits in Bearbeitung.
Timeout-Muster
Abschnitt betitelt „Timeout-Muster“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()First-to-Complete
Abschnitt betitelt „First-to-Complete“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()}
-- Die langsamere abbrechenif r.channel == f1:channel() then f2:cancel()else f1:cancel()end
return r.value:data()| Bedingung | Art |
|---|---|
| Operation abgebrochen | CANCELED |
| Asynchrone Operation fehlgeschlagen | variiert |