Die experimentelle Funktion
von Workflows,
experimental.executions.map startet für jedes
entsprechende Argument eine Workflow-Ausführung und wartet, bis alle Ausführungen abgeschlossen sind. Sie gibt
eine Liste zurück, in der jedes Element das Ergebnis einer Ausführung ist.
Wenn Sie experimental.executions.map zur Unterstützung paralleler Arbeit verwenden, können Sie
Ihren Workflow so migrieren, dass stattdessen parallele Schritte verwendet werden, bei denen gewöhnliche
for Schleifen parallel ausgeführt werden.
Ein parallel-Schritt definiert einen Teil Ihres Workflows, in dem zwei oder mehr Schritte gleichzeitig ausgeführt werden können. Ein parallel-Schritt wartet, bis alle darin definierten Schritte abgeschlossen sind oder durch eine nicht behandelte Ausnahme unterbrochen werden. Anschließend wird die Ausführung fortgesetzt. Wie bei experimental.executions.map ist die Ausführungsreihenfolge nicht garantiert. Weitere Informationen finden Sie auf der Syntaxreferenzseite für
parallele Schritte.
Für die Verwendung von experimental.executions.map oder workflows.executions.run
ist ein zusätzliches Kontingent für gleichzeitige Ausführungen erforderlich.
Wenn Sie jedoch parallele Schritte mit Inline-Aufrufen von Connectors
verwenden (siehe das Beispiel für den Übersetzungs-Connector), ist kein
zusätzliches Ausführungskontingent erforderlich.
Die folgenden Beispiele sollen Ihnen helfen, die Verwendung von experimental.executions.map durch einen parallel-Schritt zu ersetzen.
Übersetzungsworkflow
Der folgende Workflow mit dem Namen translate,
verwendet den
Cloud Translation-Connector
, um einen Eingabetext in eine Quell- und eine Zielsprache zu übersetzen und das Ergebnis zurückzugeben. Die Cloud Translation API muss aktiviert sein.
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}" } } ] } }
Eingabe für das vorherige Beispiel:
{ "text": "Bonjour", "target": "en", "source": "fr" }
Die Ausgabe sollte in etwa so aussehen:
{ "data": { "translations": [ { "translatedText": "Hello" } ] } }
Batchübersetzungsworkflow mit experimental.executions.map
Der folgende Workflow übersetzt einen Batch von Texten. Für jede Eingabe führt
experimental.executions.map den translate Workflow aus, der zuvor erstellt wurde.
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}" } } ] } }
Die Ausgabe sollte in etwa so aussehen:
[ { "data": { "translations": [ { "translatedText": "Bonjour le monde!" } ] } }, { "data": { "translations": [ { "translatedText": "Hello world!" } ] } }, { "data": { "translations": [ { "translatedText": "I don't speak Spanish!" } ] } } ]
experimental.executions.map durch eine for:in-Schleife ersetzen
Anstelle der experimentellen Funktion können Sie eine parallele for:in-Schleife verwenden, um den Text zu übersetzen. Im folgenden Beispiel kann der sekundäre Workflow translate unverändert verwendet werden und die Ausgabe sollte gleich bleiben. Sie haben auch
die Möglichkeit, andere sekundäre Workflow-Ausführungen in
parallelen Zweigenzu starten.
Eine freigegebene Variable,
translated, wird verwendet, um die Ergebnisse zu speichern. Sie wird mit leeren Strings gefüllt
, um die statische Array-Indexierung zu ermöglichen. Wenn keine Reihenfolge erforderlich ist, können Sie
list.concat die
Ergebnisse anhängen. Alle Zuweisungen in parallelen Schritten sind atomar.
YAML
JSON
experimental.executions.map durch eine for:range-Schleife ersetzen
Anstelle der experimentellen Funktion können Sie eine parallele for:range-Schleife verwenden, um den Text zu übersetzen. Mit einer for:range-Schleife können Sie den Anfang und das Ende eines Iterationsbereichs angeben. Die Ausgabe sollte gleich bleiben.
YAML
JSON
Workflow-Quellcode inline einfügen
Wenn der sekundäre Workflow relativ kurz ist, können Sie ihn zur besseren Lesbarkeit direkt in den Hauptworkflow einfügen. Im folgenden Workflow wurde beispielsweise der Quellcode für den Workflow translate inline eingefügt.