Parallel

O bloco Parallel é um contêiner que executa o bloco dentro dele de forma concorrente — uma vez por item de uma coleção ou um número fixo de vezes. Ele é o equivalente concorrente do Loop: use-o quando o trabalho é independente e a ordem não importa.

Tipos de Parallel

Executa de uma vez um número fixo de instâncias idênticas. Se a contagem for maior que o tamanho do lote, o Studio executa lotes em série e preserva a ordem original dos resultados.

Distribui uma coleção entre as instâncias — cada uma processa um único item como <parallel.currentItem>. Coleções grandes são executadas em lotes em série, preservando o índice de cada item.

Configuração

Defina o tipo de paralelismo e, em seguida, o valor que ele exige:

  • Count — quantas instâncias executar (count-based)
  • Collection — o array ou objeto a distribuir (collection-based)
  • Batch size — quantas ramificações executam ao mesmo tempo, de 1 a 20 (padrão 20). Reduza para aliviar APIs com limite de taxa

Referenciar dados do paralelismo

As referências são diferentes 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 (apenas collection-based)
  • <parallel.items> — a coleção completa (apenas collection-based)

Esses valores só estão disponíveis para blocks dentro do contêiner Parallel.

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

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

Para conjuntos grandes de resultados, referencie apenas a entrada ou o campo de que você precisa, como <processtasks.results[10][0].id> — o Studio mantém os resultados indexáveis e hidrata entradas muito grandes somente quando um caminho indexado é referenciado.

Cada instância executa isolada: escopo de variáveis separado, nenhum estado compartilhado e uma falha em uma instância não interrompe as outras.

Exemplos

Um Parallel collection-based chama um endpoint para cada tarefa ao mesmo tempo, e um Function agrega <parallel.results> quando elas terminam. O mesmo contêiner abriga o block em qualquer um dos tipos:

  • Processamento de API em lote — Parallel (Collection) → API (Call Endpoint) → Function (Aggregate)
  • Processamento com vários modelos — Parallel (["model-a", "model-b", "model-c"]) → Agent → Evaluator (Select best)

Parallel vs Loop

ParallelLoop
ExecuçãoConcorrenteSequencial
OrdemNão garantidaPreservada
Melhor paraTrabalho independenteEtapas dependentes
Uso de recursosMaiorMenor

Aninhamento e limites

Contêineres podem ser aninhados. Você pode colocar Parallel dentro de Parallel, Loop dentro de Parallel e qualquer combinação, para montar workflows multidimensionais.

Um Parallel executa até 20 ramificações ao mesmo tempo. Contagens ou coleções maiores rodam em lotes em série, assim que o lote atual termina. Como as instâncias executam de forma concorrente, fique atento a limites de taxa das APIs e ao uso de memória com grandes volumes de dados.

Boas práticas

  • Use apenas para trabalho independente. As instâncias não compartilham estado, então cada uma precisa se sustentar sozinha.
  • Atenção aos limites de taxa. Reduza o batch size, ou adicione um Wait, em trabalhos com muitas chamadas de API.
  • Trate erros por instância. Uma falha não interrompe as outras, então cada instância deve tratar a própria.
  • Adicione um identificador se a ordem importar. Não há garantia de que os resultados correspondam à ordem de entrada — inclua um índice 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 lotes em série.
Não. Cada instância executa isolada, com seu próprio escopo de variáveis, e uma instância não pode ler nem escrever os dados de outra durante a execução.
Somente aquela instância falha. As outras executam de forma independente e seguem normalmente.
Sim. Parallel e Loop aceitam aninhamento em qualquer combinação, então você pode montar workflows multidimensionais.
Use <blockname.results>, em que blockname é o nome normalizado do bloco Parallel (minúsculas, sem espaços). Ele retorna um array com os resultados de todas as instâncias.
Não. Como as instâncias executam de forma concorrente, não há garantia de que a ordem dos resultados corresponda à ordem de entrada. Se a ordem importa, inclua um índice ou identificador na saída de cada instância.
O count-based executa um número fixo de instâncias idênticas. O collection-based distribui itens de um array ou objeto, um por instância. Use count-based para trabalho repetido e collection-based para processamento em lote.