La funzione sperimentale experimental.executions.map
di Workflows 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 passaggi paralleli, eseguendo i normali for
loop in parallelo.
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 interrotti da un'eccezione non gestita; l'esecuzione continua. Come
experimental.executions.map
, l'ordine di esecuzione non è garantito. Per maggiori dettagli, consulta la pagina di riferimento sulla 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 incorporati (vedi l'esempio del connettore di traduzione), non è necessaria alcuna quota di esecuzione aggiuntiva.
I seguenti esempi hanno lo scopo di aiutarti quando sostituisci l'utilizzo di
experimental.executions.map
con un passaggio parallel
.
Flusso di lavoro di traduzione
Data una lingua di origine e di destinazione, il seguente flusso di lavoro, denominato translate
, utilizza il connettore Cloud Translation per tradurre parte 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 della 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 loop 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 deve rimanere invariato. Hai inoltre la possibilità di avviare altre esecuzioni di flussi di lavoro secondari in rami paralleli.
Una variabile condivisa,
translated
, viene utilizzata per archiviare i risultati e viene compilata con stringhe vuote
per abilitare l'indicizzazione statica dell'array. Se non è necessario ordinare, puoi utilizzare list.concat
per aggiungere i risultati. Tutte le assegnazioni in passaggi paralleli sono atomiche.
YAML
JSON
Sostituisci experimental.executions.map
con un loop for:range
Anziché utilizzare la funzione sperimentale, puoi utilizzare un loop for:range
in parallelo per tradurre il testo. Con un loop for:range
, puoi specificare
l'inizio e la fine di un intervallo di iterazione. L'output dovrebbe rimanere invariato.
YAML
JSON
Incorporare il codice sorgente del flusso di lavoro
Se il flusso di lavoro secondario è relativamente breve, ti consigliamo di includerlo
direttamente all'interno del flusso di lavoro principale per una migliore leggibilità. Ad esempio, nel seguente flusso di lavoro è stato integrato il codice sorgente per il flusso di lavoro translate
.