La funzione sperimentale Flussi di lavoro, experimental.executions.map
, avvia un'esecuzione del flusso di lavoro per ogni argomento corrispondente e attende il completamento di tutte le esecuzioni, restituendo un elenco in cui ogni elemento è il risultato di un'esecuzione.
Se utilizzi experimental.executions.map
per supportare il lavoro parallelo, puoi:
eseguire la migrazione del flusso di lavoro per usare passaggi paralleli, eseguendo
for
loop in parallelo.
Un passaggio parallel
definisce una parte del flusso di lavoro in cui possono essere
vengono eseguite contemporaneamente. Un passaggio parallel
attende che tutti i passaggi definiti al suo interno siano stati completati o siano stati interrotti da un'eccezione non gestita; l'esecuzione prosegue. Come accade per experimental.executions.map
, l'ordine di esecuzione non è garantito. Per maggiori dettagli, consulta la pagina di riferimento della sintassi per i passaggi paralleli.
Tieni presente che l'utilizzo di experimental.executions.map
o workflows.executions.run
richiede una quota di esecuzioni simultanee aggiuntiva.
Tuttavia, quando utilizzi passaggi paralleli con chiamate ai connettori
in linea (vedi l'esempio di connettore di traduzione), non è necessaria alcuna quota di esecuzione aggiuntiva.
I seguenti esempi hanno lo scopo di aiutarti in caso di sostituzione dell'utilizzo di
experimental.executions.map
con un passaggio di parallel
.
Flusso di lavoro di traduzione
Date una lingua di origine e una di destinazione, il seguente flusso di lavoro, denominato translate
,
utilizza il
connettore Cloud Translation
per tradurre del testo di input e restituire il risultato. Tieni presente che l'API Cloud Translation
devono essere abilitati.
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}" } } ] } }
Input per l'esempio precedente:
{ "text": "Bonjour", "target": "en", "source": "fr" }
L'output dovrebbe essere simile al seguente:
{ "data": { "translations": [ { "translatedText": "Hello" } ] } }
Flusso di lavoro di traduzione batch con experimental.executions.map
Il seguente flusso di lavoro traduce un batch di testi. Per ogni input,
experimental.executions.map
esegue il flusso di lavoro translate
creato
in precedenza.
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}" } } ] } }
L'output dovrebbe essere simile al seguente:
[ { "data": { "translations": [ { "translatedText": "Bonjour le monde!" } ] } }, { "data": { "translations": [ { "translatedText": "Hello world!" } ] } }, { "data": { "translations": [ { "translatedText": "I don't speak Spanish!" } ] } } ]
Sostituisci experimental.executions.map
con un ciclo for:in
Anziché utilizzare la funzione sperimentale, puoi utilizzare un loop for:in
parallelo per tradurre il testo. Nell'esempio seguente, il flusso di lavoro secondario,
translate
, può essere utilizzato così com'è e l'output dovrebbe rimanere invariato. Inoltre
hanno la possibilità di avviare altre esecuzioni di flussi di lavoro secondari
rami paralleli.
Una variabile condivisa,
translated
, viene utilizzato per archiviare i risultati e viene compilato con stringhe vuote
per abilitare l'indicizzazione degli array statici. Se l'ordinamento non è obbligatorio, puoi utilizzare
list.concat
per accodare i risultati. Tutti i compiti nei passaggi paralleli sono atomici.
YAML
JSON
Sostituisci experimental.executions.map
con un ciclo for:range
Anziché utilizzare la funzione sperimentale, puoi utilizzare una funzione for:range
parallela
loop per tradurre il testo. Utilizzando un loop for:range
, puoi specificare
l'inizio e la fine di un intervallo di iterazione. L'output dovrebbe rimanere invariato.
YAML
JSON
Inserisci in linea il codice sorgente del flusso di lavoro
Se il flusso di lavoro secondario è relativamente breve, ti consigliamo di includerlo direttamente nel flusso di lavoro principale per una maggiore leggibilità. Ad esempio, nel
seguente, il codice sorgente per il flusso di lavoro translate
è stato
in linea.