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:range
loop, 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.