A função experimental do Workflows,
experimental.executions.map
, inicia uma execução de fluxo de trabalho para cada
argumento correspondente e aguarda a conclusão de todas as execuções, retornando
uma lista em que cada elemento é o resultado de uma execução.
Se você estiver usando experimental.executions.map
para oferecer suporte a trabalhos paralelos, poderá
migrar seu fluxo de trabalho para usar etapas paralelas, executando loops
for
comuns em paralelo.
Uma etapa parallel
define uma parte do fluxo de trabalho em que duas ou mais etapas podem
ser executadas simultaneamente. Uma etapa parallel
aguarda até que todas as etapas definidas
sejam concluídas ou interrompidas por uma exceção não tratada. Em seguida, a execução
continua. Assim como
experimental.executions.map
, a ordem de execução não é garantida. Para
mais detalhes, consulte a página de referência de sintaxe para
etapas paralelas.
O uso de experimental.executions.map
ou workflows.executions.run
requer uma cota de execuções simultâneas extra.
No entanto, ao usar etapas paralelas com chamadas para conectores
inline (consulte o exemplo de conector de tradução), nenhuma
cota de execução adicional é necessária.
Os exemplos a seguir têm o objetivo de ajudar você a substituir o uso de
experimental.executions.map
por uma etapa parallel
.
Fluxo de trabalho de tradução
Considerando um idioma de origem e um de destino, o fluxo de trabalho a seguir, chamado translate
,
usa o
conector do Cloud Translation
para traduzir um texto de entrada e retornar o resultado. A API Cloud Translation
precisa estar ativada.
YAML
main: params: [args] steps: - basic_translate: call: googleapis.translate.v2.translations.translate args: body: q: ${args.text} target: ${args.target} format: "text" source: ${args.source} result: r - return_step: return: ${r}
JSON
{ "main": { "params": [ "args" ], "steps": [ { "basic_translate": { "call": "googleapis.translate.v2.translations.translate", "args": { "body": { "q": "${args.text}", "target": "${args.target}", "format": "text", "source": "${args.source}" } }, "result": "r" } }, { "return_step": { "return": "${r}" } } ] } }
Entrada para o exemplo anterior:
{ "text": "Bonjour", "target": "en", "source": "fr" }
A saída será semelhante a esta:
{ "data": { "translations": [ { "translatedText": "Hello" } ] } }
Fluxo de trabalho de tradução em lote usando experimental.executions.map
O fluxo de trabalho a seguir traduz um lote de textos. Para cada entrada,
experimental.executions.map
executa o fluxo de trabalho translate
criado
anteriormente.
YAML
main: steps: - init: assign: - workflow_id: "translate" - texts_to_translate: - text: "hello world!" source: "en" target: "fr" - text: "你好 世界!" source: "zh-CN" target: "en" - text: "No hablo español!" source: "es" target: "en" - translate_texts: call: experimental.executions.map args: workflow_id: ${workflow_id} arguments: ${texts_to_translate} result: translated - return: return: ${translated}
JSON
{ "main": { "steps": [ { "init": { "assign": [ { "workflow_id": "translate" }, { "texts_to_translate": [ { "text": "hello world!", "source": "en", "target": "fr" }, { "text": "你好 世界!", "source": "zh-CN", "target": "en" }, { "text": "No hablo español!", "source": "es", "target": "en" } ] } ] } }, { "translate_texts": { "call": "experimental.executions.map", "args": { "workflow_id": "${workflow_id}", "arguments": "${texts_to_translate}" }, "result": "translated" } }, { "return": { "return": "${translated}" } } ] } }
A saída será semelhante a esta:
[ { "data": { "translations": [ { "translatedText": "Bonjour le monde!" } ] } }, { "data": { "translations": [ { "translatedText": "Hello world!" } ] } }, { "data": { "translations": [ { "translatedText": "I don't speak Spanish!" } ] } } ]
Substituir experimental.executions.map
por um loop for:in
Em vez de usar a função experimental, use um loop for:in
paralelo
para traduzir o texto. No exemplo a seguir, o fluxo de trabalho secundário,
translate
, pode ser usado como está, e a saída não muda. Você também
tem a opção de iniciar outras execuções de fluxo de trabalho secundário em
filiais paralelas.
Uma variável compartilhada,
translated
, é usada para armazenar os resultados e é preenchida com strings vazias
para ativar a indexação estática de matrizes. Se a ordenação não for necessária, use
list.concat
para anexar os
resultados. Todas as atribuições em etapas paralelas são atômicas.
YAML
JSON
Substituir experimental.executions.map
por um loop for:range
Em vez de usar a função experimental, use um loop for:range
paralelo
para traduzir o texto. Ao usar um loop for:range
, você pode especificar
o início e o fim de um intervalo de iteração. A saída não será modificada.
YAML
JSON
Inserir o código-fonte do fluxo de trabalho
Se o fluxo secundário for relativamente breve, inclua-o
diretamente no fluxo principal para facilitar a leitura. Por exemplo, no
fluxo de trabalho a seguir, o código-fonte do fluxo de trabalho translate
foi
inlinizado.