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 API —
Parallel (Collection) → API (Call Endpoint) → Function (Aggregate) - Processamento multi-modelo —
Parallel (["model-a", "model-b", "model-c"]) → Agent → Evaluator (Select best)
Parallel vs Loop
| Parallel | Loop | |
|---|---|---|
| Execução | Concorrente | Sequencial |
| Ordem | Não garantida | Preservada |
| Melhor para | Trabalho independente | Passos dependentes |
| Uso de recurso | Maior | Menor |
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.