La funzione sperimentale 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 in modo da utilizzare i passaggi paralleli, eseguendo in parallelo i normali loop for
.
Un passaggio parallel
definisce una parte del flusso di lavoro in cui possono essere eseguiti contemporaneamente due o più passaggi. 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 un'ulteriore quota di esecuzioni simultanee.
Tuttavia, quando utilizzi passaggi paralleli con chiamate ai connettori in linea (vedi l'esempio di connettore di traduzione), non è richiesta alcuna quota di esecuzione aggiuntiva.
Gli esempi riportati di seguito hanno lo scopo di aiutarti a sostituire l'utilizzo di experimental.executions.map
con un passaggio 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 deve essere abilitata.
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 utilizzando 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. Puoi anche avviare altre esecuzioni di flussi di lavoro secondari in rami paralleli.
Una variabile condivisa,
translated
, viene utilizzata per memorizzare i risultati e viene compilata con stringhe vuote
per abilitare l'indicizzazione dell'array statico. 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 un loop for:range
parallelo per tradurre il testo. Utilizzando un ciclo 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 flusso di lavoro, il codice sorgente per il flusso di lavoro translate
è stato
in linea.