La fonction expérimentale Workflows
,
experimental.executions.map, démarre une exécution de workflow pour chaque
argument correspondant et attend que toutes les exécutions soient terminées. Elle renvoie
une liste où chaque élément est le résultat d'une exécution.
Si vous utilisez experimental.executions.map pour prendre en charge le travail parallèle, vous pouvez
migrer votre workflow pour utiliser des étapes parallèles à la place, en exécutant des boucles
for ordinaires en parallèle.
Une étape parallel définit une partie de votre workflow où deux étapes ou plus peuvent s'exécuter simultanément. Une étape parallel attend que toutes les étapes définies en son sein soient terminées ou interrompues par une exception non gérée. L'exécution se poursuit ensuite. Comme experimental.executions.map, l'ordre d'exécution n'est pas garanti. Pour
en savoir plus, consultez la page de référence sur la syntaxe des
étapes parallèles.
Notez que l'utilisation de experimental.executions.map ou de workflows.executions.run
nécessite un quota d'exécutions simultanées supplémentaire.
Toutefois, lorsque vous utilisez des étapes parallèles avec des appels à des connecteurs
intégrés (voir l'exemple de connecteur de traduction), aucun
quota d'exécution supplémentaire n'est requis.
Les exemples suivants sont destinés à vous aider à remplacer l'utilisation de experimental.executions.map par une étape parallel.
Workflow de traduction
Étant donné une langue source et une langue cible, le workflow suivant, nommé translate,
utilise le
connecteur Cloud Translation
pour traduire du texte d'entrée et renvoyer le résultat. Notez que l'API Cloud Translation doit être activée.
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}" } } ] } }
Entrée pour l'exemple précédent :
{ "text": "Bonjour", "target": "en", "source": "fr" }
La sortie doit ressembler à ceci :
{ "data": { "translations": [ { "translatedText": "Hello" } ] } }
Workflow de traduction par lot à l'aide de experimental.executions.map
Le workflow suivant traduit un lot de textes. Pour chaque entrée,
experimental.executions.map exécute le translate workflow créé
précédemment.
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 sortie doit ressembler à ceci :
[ { "data": { "translations": [ { "translatedText": "Bonjour le monde!" } ] } }, { "data": { "translations": [ { "translatedText": "Hello world!" } ] } }, { "data": { "translations": [ { "translatedText": "I don't speak Spanish!" } ] } } ]
Remplacer experimental.executions.map par une boucle for:in
Au lieu d'utiliser la fonction expérimentale, vous pouvez utiliser une boucle for:in parallèle pour traduire le texte. Dans l'exemple suivant, le workflow secondaire, translate, peut être utilisé tel quel et la sortie doit rester inchangée. Vous avez également
la possibilité de démarrer d'autres exécutions de workflow secondaires dans
des branches parallèles.
Une variable partagée,
translated, est utilisée pour stocker les résultats et est remplie de chaînes vides
afin d'activer l'indexation statique des tableaux. Si l'ordre n'est pas requis, vous pouvez utiliser
list.concat pour ajouter les
résultats. Toutes les affectations dans les étapes parallèles sont atomiques.
YAML
JSON
Remplacer experimental.executions.map par une boucle for:range
Au lieu d'utiliser la fonction expérimentale, vous pouvez utiliser une boucle for:range parallèle pour traduire le texte. En utilisant une boucle for:range, vous pouvez spécifier le début et la fin d'une plage d'itération. La sortie doit rester inchangée.
YAML
JSON
Intégrer le code source du workflow
Si le workflow secondaire est relativement court, vous pouvez l'inclure directement dans le workflow principal pour faciliter la lecture. Par exemple, dans le workflow suivant, le code source du workflow translate a été intégré.