Lembre entre execuções: estado
Toda execução começa do zero — a menos que ela guarde algo. O estado é um pequeno armazenamento de chave e valor que pertence a um script ou flow e sobrevive entre as execuções: o lugar para um cursor (o último id processado), um contador ou a lista de mensagens já tratadas. Os valores são JSON, as gravações ficam mesmo que a execução falhe depois, e você lê e edita cada chave na aba Estado.
- Ler e gravar estado em Python, TypeScript, JavaScript, C e C++
- Contar com segurança com incr e mudar um valor com segurança com update
- Inspecionar, editar e zerar o estado na aba Estado
- Saber de quem é o estado que um passo de flow usa, e os limites
O que é o estado
O estado de um script é só dele: outro script nunca o vê. Dentro de um flow, todos os passos leem e gravam o estado do flow, então eles compartilham o mesmo armazenamento — um passo pode deixar um valor para um passo seguinte, ou para a próxima execução do flow. As execuções iniciadas no editor usam o mesmo estado das execuções agendadas, por API e por evento: um teste que move um cursor move de verdade.
1from waiso import state2 3def main():4 n = state.incr("runs")5 last = state.get("last_note", "none yet")6 state.set("last_note", f"run {n}")7 return {"run": n, "previous": last}last_notehá 5 h · run #8E6A00Somou runshá 5 h · run #8E6A00Definiu last_notehá 6 h · run #41C2D7Seu primeiro script com estado
- Salve o script
Crie
countercom o código abaixo. O estado pertence a um item salvo: código que nunca foi salvo não tem estado, e a chamada falha comstate_unavailable. - Rode duas vezes
Clique em Executar. A primeira saída é
{"run": 1, "previous": "none yet"}; rode de novo e ela fica{"run": 2, "previous": "run 1"}. - Abra a aba Estado
Escolha Estado na barra lateral:
runsvale2elast_notevale"run 2", cada um com a execução que gravou. Mudanças recentes lista as gravações como Somou e Definiu.
from waiso import state
def main():
n = state.incr("runs") # atomic: two runs at once never lose a count
last = state.get("last_note", "none yet")
state.set("last_note", f"run {n}")
return {"run": n, "previous": last}{
"run": 2,
"previous": "run 1"
}As chamadas
Em Python use waiso.state (ou from waiso import state). Em TypeScript e JavaScript importe state de waiso; toda chamada devolve uma promise. O C tem waiso_state_*, que devolve WAISO_OK ou um código negativo, com os valores em texto JSON; o C++ tem waiso::state, que lança WaisoError.
| Chamada | O que faz | C / C++ |
|---|---|---|
get(key, default) | O valor, ou o padrão quando a chave nunca foi gravada. | waiso_state_get · state::get |
set(key, value) | Grava o valor; fica mesmo que a execução falhe depois. | waiso_state_set · state::set |
incr(key, by=1) | Soma de forma atômica e devolve o novo número; execuções simultâneas nunca perdem uma contagem. | waiso_state_incr · state::incr |
cas(key, expected, value) | Grava só se a chave ainda tiver expected (null = ausente), e diz se gravou. | waiso_state_cas · state::cas |
update(key, fn, default) | Lê, aplica fn, grava de volta só se nada mudou no meio; 5 tentativas, depois state_conflict. Devolve o valor gravado. | — (use cas num laço) |
delete(key) | Remove a chave e diz se ela existia. | waiso_state_delete · state::del |
all() | Todas as chaves e valores num único objeto. | waiso_state_all · state::all |
Mudando um valor que duas execuções podem tocar
Um get seguido de set perde uma gravação quando duas execuções se sobrepõem: as duas leem a mesma lista e cada uma grava a sua versão. O incr resolve para números; para o resto, o update envolve a sua mudança num compare-and-set e tenta de novo.
from waiso import state
def main(numbers: list = [1, 2, 3, 4, 5]):
seen = state.get("seen", [])
fresh = [n for n in numbers if n not in seen]
# update() re-reads and retries if another run changed "seen" meanwhile
state.update("seen", lambda s: s + [n for n in fresh if n not in s], default=[])
return {"new": fresh}A aba Estado
No editor de script, Estado é uma aba lateral; na página de um flow é uma das abas da direita; a página de operação do script também mostra. Ela lista cada chave com o valor e quem gravou por último (execução … ou por uma pessoa), e quanto do espaço está em uso. Adicionar chave e Editar valor aceitam qualquer JSON (texto precisa de aspas), Apagar chave remove uma, e Zerar apaga todas as chaves depois de uma confirmação — a próxima execução começa dos valores padrão. Mudanças recentes mostra as 50 últimas gravações como Definiu, Somou, Apagou ou Zerou.
Limites e códigos de erro
- Cada script ou flow guarda no máximo 1 MB e 1.000 chaves; uma chave tem de 1 a 200 caracteres, sem quebras de linha.
- O registro de mudanças guarda as 50 últimas gravações; os valores não são copiados para ele.
- Excluir o script ou flow exclui o estado dele.
| Código | Quando |
|---|---|
state_too_large | Uma gravação passaria de 1 MB ou 1.000 chaves. |
state_conflict | update encontrou o valor mudado nas 5 tentativas. |
state_invalid_value | O valor não é JSON, ou o incr encontrou algo que não é número. |
state_key_invalid | Chave vazia, com mais de 200 caracteres ou com caracteres de controle. |
state_unavailable | A execução não pertence a nenhum script ou flow salvo. |