AutomatizeEtapa 3 de 5

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.

O que você vai aprender
  • 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.

docs-demoCódigocounter.pyPublicar
counter.py
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}
Estado2
Execuções de teste do editor usam este mesmo estado: um teste que move um cursor move de verdade.Os valores aparecem abertos aqui. Nunca guarde senhas ou tokens no estado — use Variáveis.
2 chaves21 B de 1,00 MBAdicionar chaveZerar
last_notehá 5 h · run #8E6A00"run 9"
runshá 5 h · run #8E6A009
Mudanças recentes (18)Definiu last_notehá 5 h · run #8E6A00Somou runshá 5 h · run #8E6A00Definiu last_notehá 6 h · run #41C2D7
A aba Estado: cada chave com o valor e a execução que gravou por último, o espaço usado e Mudanças recentes.

Seu primeiro script com estado

  1. Salve o script

    Crie counter com 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 com state_unavailable.

  2. 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"}.

  3. Abra a aba Estado

    Escolha Estado na barra lateral: runs vale 2 e last_note vale "run 2", cada um com a execução que gravou. Mudanças recentes lista as gravações como Somou e Definiu.

counter.py
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}
Saída esperadaSucessoA saída da segunda execução
{
  "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.

ChamadaO que fazC / 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.

only-new.py
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ódigoQuando
state_too_largeUma gravação passaria de 1 MB ou 1.000 chaves.
state_conflictupdate encontrou o valor mudado nas 5 tentativas.
state_invalid_valueO valor não é JSON, ou o incr encontrou algo que não é número.
state_key_invalidChave vazia, com mais de 200 caracteres ou com caracteres de controle.
state_unavailableA execução não pertence a nenhum script ou flow salvo.
3 / 5