La función experimental de Workflows
,
experimental.executions.map, inicia una ejecución de flujo de trabajo para cada argumento
correspondiente y espera a que finalicen todas las ejecuciones, y muestra
una lista en la que cada elemento es el resultado de una ejecución.
Si usas experimental.executions.map para admitir el trabajo en paralelo, puedes
migrar tu flujo de trabajo para que use pasos paralelos y ejecute bucles
for normales en paralelo.
Un paso parallel define una parte de tu flujo de trabajo en la que se pueden ejecutar dos o más pasos de forma simultánea. Un paso parallel espera hasta que se completen todos los pasos definidos en él o hasta que se interrumpan por una excepción no controlada. Luego, la ejecución continúa. Al igual que experimental.executions.map, no se garantiza el orden de ejecución. Para
obtener más información, consulta la página de referencia de sintaxis para
los pasos paralelos.
Ten en cuenta que el uso de experimental.executions.map o workflows.executions.run
requiere una cuota adicional de ejecuciones simultáneas.
Sin embargo, cuando se usan pasos paralelos con llamadas a conectores
intercalados (consulta el ejemplo del conector de traducción), no
se requiere una cuota de ejecución adicional.
Los siguientes ejemplos están diseñados para ayudarte cuando reemplazas el uso de experimental.executions.map por un paso parallel.
Flujo de trabajo de traducción
Dada una fuente y un idioma de destino, el siguiente flujo de trabajo, llamado translate,
usa el
conector de Cloud Translation
para traducir un texto de entrada y mostrar el resultado. Ten en cuenta que la API de Cloud Translation debe estar habilitada.
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 el ejemplo anterior:
{ "text": "Bonjour", "target": "en", "source": "fr" }
El resultado debe parecerse al siguiente:
{ "data": { "translations": [ { "translatedText": "Hello" } ] } }
Flujo de trabajo de traducción por lotes con experimental.executions.map
El siguiente flujo de trabajo traduce un lote de textos. Para cada entrada,
experimental.executions.map ejecuta el translate flujo de trabajo creado
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}" } } ] } }
El resultado debe parecerse al siguiente:
[ { "data": { "translations": [ { "translatedText": "Bonjour le monde!" } ] } }, { "data": { "translations": [ { "translatedText": "Hello world!" } ] } }, { "data": { "translations": [ { "translatedText": "I don't speak Spanish!" } ] } } ]
Reemplaza experimental.executions.map por un bucle for:in
En lugar de usar la función experimental, puedes usar un bucle for:in paralelo para traducir el texto. En el siguiente ejemplo, el flujo de trabajo secundario, translate, se puede usar tal como está y el resultado no debería cambiar. También tienes la opción de iniciar otras ejecuciones de flujo de trabajo secundarias en
ramas paralelas.
Una variable compartida,
translated, se usa para almacenar los resultados y se propaga con cadenas vacías
para habilitar la indexación de arrays estáticos. Si no se requiere el ordenamiento, puedes usar
list.concat para agregar los
resultados. Todas las asignaciones en pasos paralelos son atómicas.
YAML
JSON
Reemplaza experimental.executions.map por un bucle for:range
En lugar de usar la función experimental, puedes usar un bucle for:range paralelo para traducir el texto. Si usas un bucle for:range, puedes especificar el comienzo y el final de un rango de iteración. El resultado no debería cambiar.
YAML
JSON
Intercala el código fuente del flujo de trabajo
Si el flujo de trabajo secundario es relativamente breve, es posible que desees incluirlo directamente en el flujo de trabajo principal para facilitar la lectura. Por ejemplo, en el siguiente flujo de trabajo, se intercaló el código fuente del flujo de trabajo translate.