Sostituire la funzione sperimentale con il passaggio parallelo

La funzione sperimentale dei workflow , experimental.executions.map, avvia l'esecuzione di un workflow 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 workflow per utilizzare invece i passaggi paralleli, eseguendo i normali for loop in parallelo.

Un passaggio parallel definisce una parte del workflow in cui due o più passaggi possono essere eseguiti contemporaneamente. Un passaggio parallel attende il completamento o l'interruzione di tutti i passaggi definiti al suo interno a causa di 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 per la sintassi dei 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 del connettore di traduzione), non è richiesta alcuna quota di esecuzione aggiuntiva.

Gli esempi seguenti hanno lo scopo di aiutarti a sostituire l'utilizzo di experimental.executions.map con un passaggio parallel.

Workflow di traduzione

Dati una lingua di origine e una di destinazione, il seguente workflow, denominato translate, utilizza il connettore Cloud Translation per tradurre un 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"
     }
   ]
 }
}

Workflow di traduzione batch che utilizza experimental.executions.map

Il seguente workflow traduce un batch di testi. Per ogni input, experimental.executions.map esegue il translate workflow 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!"