A função experimental Workflows
experimental.executions.map inicia uma execução do fluxo de trabalho para cada
argumento correspondente e aguarda que todas as execuções terminem, devolvendo
uma lista em que cada elemento é o resultado de uma execução.
Se estiver a usar experimental.executions.map para suportar o trabalho paralelo, pode migrar o seu fluxo de trabalho para usar passos paralelos. Em alternativa, pode executar ciclos for normais em paralelo.
Um passo parallel define uma parte do seu fluxo de trabalho em que dois ou mais passos podem ser executados em simultâneo. Um passo parallel aguarda até que todos os passos definidos no seu interior estejam concluídos ou sejam interrompidos por uma exceção não processada. Em seguida, a execução continua. Tal como
experimental.executions.map, a ordem de execução não é garantida. Para ver detalhes, consulte a página de referência de sintaxe para passos paralelos.
Tenha em atenção que a utilização de experimental.executions.map ou workflows.executions.run
requer uma quota de execuções simultâneas adicional.
No entanto, quando usa passos paralelos com chamadas para conectores incorporados (consulte o exemplo de conector de tradução), não é necessária uma quota de execução adicional.
Os exemplos seguintes destinam-se a ajudar quando substituir a utilização de
experimental.executions.map por um passo parallel.
Fluxo de trabalho de tradução
Dado um idioma de origem e de destino, o seguinte fluxo de trabalho, denominado translate, usa o conetor do Cloud Translation para traduzir algum texto de entrada e devolver o resultado. Tenha em atenção que a API Cloud Translation
tem de 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" }
O resultado deve ser semelhante ao seguinte:
{ "data": { "translations": [ { "translatedText": "Hello" } ] } }
Fluxo de trabalho de tradução em lote com o experimental.executions.map
O fluxo de trabalho seguinte traduz um lote de textos. Para cada entrada, o 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}" } } ] } }
O resultado deve ser semelhante ao seguinte:
[ { "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 ciclo de for:in
Em vez de usar a função experimental, pode usar um ciclo for:in paralelo
para traduzir o texto. No exemplo seguinte, o fluxo de trabalho secundário,
translate, pode ser usado tal como está e a saída deve permanecer inalterada. Também tem a opção de iniciar outras execuções de fluxos de trabalho secundários em ramificações paralelas.
É usada uma variável partilhada,
translated>, para armazenar os resultados e é preenchida com strings vazias
para ativar a indexação de matrizes estáticas. Se não for necessária a ordenação, pode usar list.concat para acrescentar os resultados. Todas as atribuições em passos paralelos são atómicas.
YAML
JSON
Substituir experimental.executions.map por um ciclo de for:range
Em vez de usar a função experimental, pode usar um ciclo for:range
paralelo para traduzir o texto. Ao usar um for:rangeloop, pode especificar
o início e o fim de um intervalo de iteração. O resultado deve permanecer inalterado.
YAML
JSON
Incorporar o código-fonte do fluxo de trabalho
Se o fluxo de trabalho secundário for relativamente breve, é recomendável incluí-lo diretamente no fluxo de trabalho principal para facilitar a leitura. Por exemplo, no fluxo de trabalho seguinte, o código-fonte do fluxo de trabalho translate foi incorporado.