La función experimental Workflows,
experimental.executions.map
, inicia una ejecución de flujo de trabajo para cada argumento correspondiente y espera a que finalicen todas las ejecuciones. Después, devuelve 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 simultáneamente. Un paso parallel
espera hasta que se hayan completado todos los pasos definidos en él o hasta que se interrumpan por una excepción no controlada. Después, se continúa con la ejecución. 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 la sintaxis de los pasos paralelos.
Ten en cuenta que, para usar experimental.executions.map
o workflows.executions.run
, se necesita una cuota de ejecuciones simultáneas adicional.
Sin embargo, cuando se usan pasos paralelos con llamadas a conectores insertados (consulta el ejemplo de conector de traducción), no se requiere ninguna cuota de ejecución adicional.
Los siguientes ejemplos tienen como objetivo ayudarte a sustituir el uso de
experimental.executions.map
por un paso parallel
.
Flujo de trabajo de traducción
Dado un idioma de origen y otro de destino, el siguiente flujo de trabajo, llamado translate
, usa el conector de Cloud Translation para traducir un texto de entrada y devolver el resultado. Ten en cuenta que la API 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 del ejemplo anterior:
{ "text": "Bonjour", "target": "en", "source": "fr" }
La salida debería ser similar a la 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. Por cada entrada, experimental.executions.map
ejecuta el flujo de trabajo translate
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}" } } ] } }
La salida debería ser similar a la siguiente:
[ { "data": { "translations": [ { "translatedText": "Bonjour le monde!" } ] } }, { "data": { "translations": [ { "translatedText": "Hello world!" } ] } }, { "data": { "translations": [ { "translatedText": "I don't speak Spanish!" } ] } } ]
Sustituye 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 cual y el resultado no debería cambiar. También tienes la opción de iniciar otras ejecuciones de flujo de trabajo secundario en ramas paralelas.
Se usa una variable compartida,translated
, para almacenar los resultados y se rellena con cadenas vacías
para habilitar la indexación de arrays estáticos. Si no es necesario ordenar los resultados, puedes usar list.concat
para añadirlos. Todas las asignaciones de los pasos paralelos son atómicas.
YAML
JSON
Sustituye 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. Con un bucle for:range
, puedes especificar el inicio y el final de un intervalo de iteración. La salida no debería cambiar.
YAML
JSON
Insertar el código fuente del flujo de trabajo
Si el flujo de trabajo secundario es relativamente breve, puedes incluirlo directamente en el flujo de trabajo principal para que sea más fácil de leer. Por ejemplo, en el siguiente flujo de trabajo, se ha insertado el código fuente del flujo de trabajo translate
.