Workflows 实验性函数 experimental.executions.map
会为每个对应的参数启动一个工作流执行,并等待所有执行完成,然后返回一个列表,其中每个元素都是一次执行的结果。
如果您使用 experimental.executions.map
来支持并行工作,则可以改为迁移工作流以使用并行步骤,并行执行普通的 for
循环。
parallel
步骤用于定义工作流的一部分,其中两个或更多步骤可以并发执行。parallel
步骤会等待其内定义的所有步骤完成或被未处理的异常中断;然后,执行会继续。与 experimental.executions.map
一样,无法保证执行顺序。如需了解详情,请参阅并行步骤的语法参考页面。
请注意,使用 experimental.executions.map
或 workflows.executions.run
需要额外的并发执行配额。不过,如果使用并行步骤并内嵌连接器调用(请参阅转换连接器示例),则无需额外的执行配额。
以下示例旨在帮助您将 experimental.executions.map
的使用替换为 parallel
步骤。
翻译工作流程
给定源语言和目标语言,以下名为 translate
的工作流会使用 Cloud Translation 连接器翻译一些输入文本并返回结果。请注意,必须启用 Cloud Translation API。
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}" } } ] } }
上述示例的输入:
{ "text": "Bonjour", "target": "en", "source": "fr" }
输出应类似于以下内容:
{ "data": { "translations": [ { "translatedText": "Hello" } ] } }
使用 experimental.executions.map
的批量转换工作流
以下工作流会翻译一批文本。对于每个输入,experimental.executions.map
都会执行之前创建的 translate
工作流。
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}" } } ] } }
输出应类似于以下内容:
[ { "data": { "translations": [ { "translatedText": "Bonjour le monde!" } ] } }, { "data": { "translations": [ { "translatedText": "Hello world!" } ] } }, { "data": { "translations": [ { "translatedText": "I don't speak Spanish!" } ] } } ]
将 experimental.executions.map
替换为 for:in
循环
您可以使用并行 for:in
循环来翻译文本,而无需使用实验性函数。在以下示例中,辅助工作流 translate
可以按原样使用,并且输出应保持不变。您还可以选择在并行分支中启动其他次要工作流执行。
共享变量 translated
用于存储结果,并填充空字符串以启用静态数组编制索引。如果不需要排序,您可以使用 list.concat
附加结果。并行步骤中的所有赋值都是原子赋值。
YAML
JSON
将 experimental.executions.map
替换为 for:range
循环
您可以使用并行 for:range
循环来翻译文本,而无需使用实验性函数。通过使用 for:range
循环,您可以指定迭代范围的开始和结束。输出应保持不变。
YAML
JSON
内嵌工作流源代码
如果辅助工作流相对较短,您可能需要直接将其包含在主工作流中,以便于阅读。例如,在以下工作流中,translate
工作流的源代码已内嵌。