Reference

Parallel

O bloco Parallel é um container que roda o bloco dentro dele de forma concorrente — uma vez por item numa coleção, ou um número fixo de vezes. É a contraparte concorrente de um Loop: use quando o trabalho é independente e a ordem não importa.

Tipos de parallel

Roda um número fixo de instâncias idênticas ao mesmo tempo. Se a contagem for maior que o batch size, o Zoen roda batches seriais e preserva a ordem original dos resultados.

Distribui uma coleção entre instâncias — cada uma processa um único item como <parallel.currentItem>. Coleções grandes rodam em batches seriais, preservando o índice de cada item.

Configuração

Defina o tipo de parallel e depois o valor de que ele precisa:

  • Count — quantas instâncias rodar (baseado em contagem)
  • Collection — o array ou objeto a distribuir (baseado em coleção)
  • Batch size — quantos branches rodam ao mesmo tempo, de 1 a 20 (padrão 20). Baixe para aliviar APIs com rate limit

Referenciando dados do parallel

As referências diferem dentro do parallel e depois dele.

Dentro, leia o contexto desta instância com <parallel.*>:

  • <parallel.index> — o número da instância, começando em 0
  • <parallel.currentItem> — o item desta instância (só baseado em coleção)
  • <parallel.items> — a coleção completa (só baseado em coleção)

Esses só estão disponíveis para blocos dentro do container parallel.

Depois que termina, leia os resultados coletados pelo nome do bloco — não <parallel.*>:

// a parallel named "Process Tasks"
const all = <processtasks.results>; // [result1, result2, ...]

Para conjuntos grandes de resultados, referencie só a entrada ou o campo de que precisa, como <processtasks.results[10][0].id> — o Zoen mantém resultados indexáveis e hidrata entradas oversized só quando um caminho indexado é referenciado.

Cada instância roda em isolamento: um escopo de variáveis separado, sem estado compartilhado, e uma falha numa instância não para as outras.

Exemplos

Um Parallel baseado em coleção chama um endpoint para cada task ao mesmo tempo, e um Function agrega <parallel.results> depois que terminam. O mesmo container segura o bloco para qualquer tipo:

  • Processamento em batch de APIParallel (Collection) → API (Call Endpoint) → Function (Aggregate)
  • Processamento multi-modeloParallel (["model-a", "model-b", "model-c"]) → Agent → Evaluator (Select best)

Parallel vs Loop

ParallelLoop
ExecuçãoConcorrenteSequencial
OrdemNão garantidaPreservada
Melhor paraTrabalho independentePassos dependentes
Uso de recursoMaiorMenor

Aninhamento e limites

Containers aninham. Você pode colocar parallels dentro de parallels, loops dentro de parallels e qualquer combinação, para construir workflows multidimensionais.

Um Parallel roda até 20 branches por vez. Contagens ou coleções maiores rodam em batches seriais quando o batch atual termina. Como as instâncias rodam de forma concorrente, fique de olho em rate limits de API e uso de memória em datasets grandes.

Boas práticas

  • Use só para trabalho independente. Instâncias não podem compartilhar estado, então cada uma precisa se sustentar sozinha.
  • Respeite rate limits. Baixe o batch size, ou adicione um Wait, para trabalho pesado em API.
  • Trate erros por instância. Uma falha não para as outras, então cada instância deve tratar a sua.
  • Adicione um identificador se a ordem importar. Resultados não são garantidos de bater com a ordem de entrada — inclua um index ou id na saída de cada instância.

Common Questions

Vinte por vez. O limite evita esgotamento de recursos e mantém a execução estável; contagens maiores rodam em batches seriais.
Não. Cada instância roda em isolamento com seu próprio escopo de variáveis, e uma instância não pode ler ou escrever os dados de outra durante a execução.
Só aquela instância falha. As outras rodam de forma independente e continuam normalmente.
Sim. Parallels e Loops suportam aninhamento em qualquer combinação, então você pode construir workflows multidimensionais.
Use <blockname.results>, onde blockname é o nome normalizado do bloco Parallel (minúsculas, sem espaços). Retorna um array de resultados de todas as instâncias.
Não. Como as instâncias rodam de forma concorrente, a ordem dos resultados não é garantida de bater com a ordem de entrada. Se a ordem importar, inclua um index ou identificador na saída de cada instância.
Baseado em contagem roda um número fixo de instâncias idênticas. Baseado em coleção distribui itens de um array ou objeto, um por instância. Use baseado em contagem para trabalho repetido e baseado em coleção para processamento em batch.

On this page