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
| Parallel | Loop | |
|---|---|---|
| Execução | Concorrente | Sequencial |
| Ordem | Não garantida | Preservada |
| Melhor para | Trabalho independente | Etapas dependentes |
| Uso de recursos | Maior | Menor |
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.