<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>工作流 on Dapr 文档库</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/</link><description>Recent content in 工作流 on Dapr 文档库</description><generator>Hugo</generator><language>zh-hans</language><atom:link href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/index.xml" rel="self" type="application/rss+xml"/><item><title>工作流概述</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-overview/</guid><description>&lt;p>Dapr 工作流让开发人员能够可靠地编写业务逻辑和集成。由于 Dapr 工作流是有状态的，它们支持长时间运行和容错应用程序，非常适合编排微服务。Dapr 工作流与其他 Dapr 构建块（如服务调用、发布订阅、状态管理和绑定）无缝协作。&lt;/p>
&lt;p>Dapr 工作流的耐用性和弹性功能包括：&lt;/p>
&lt;ul>
&lt;li>提供内置的工作流运行时以驱动 Dapr 工作流执行。&lt;/li>
&lt;li>提供用于在代码中编写工作流的 SDK，支持多种编程语言。&lt;/li>
&lt;li>提供用于管理工作流（启动、查询、暂停/恢复、触发事件、终止、清除）的 HTTP 和 gRPC API。&lt;/li>
&lt;li>通过工作流组件与其他工作流运行时集成。&lt;/li>
&lt;/ul>
&lt;img src="https://v1-18.docs.dapr.io/images/workflow-overview/workflow-overview.png" width=800 alt="显示 Dapr 工作流基础的图示">
&lt;p>Dapr 工作流可以应用于以下场景：&lt;/p>
&lt;ul>
&lt;li>涉及库存管理、支付系统和运输服务之间编排的订单处理。&lt;/li>
&lt;li>协调多个部门和参与者任务的人力资源入职工作流。&lt;/li>
&lt;li>在全国餐饮连锁店中协调数字菜单更新的推出。&lt;/li>
&lt;li>涉及基于 API 的分类和存储的图像处理工作流。&lt;/li>
&lt;/ul>
&lt;h2 id="功能">功能&lt;/h2>
&lt;h3 id="工作流和活动">工作流和活动&lt;/h3>
&lt;p>使用 Dapr 工作流，您可以编写活动，然后在工作流中编排这些活动。工作流活动是：&lt;/p>
&lt;ul>
&lt;li>工作流中的基本工作单元&lt;/li>
&lt;li>用于调用其他（Dapr）服务、与状态存储交互以及发布订阅代理。&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#%23workflow-activities">了解更多关于工作流活动的信息。&lt;/a>&lt;/p>
&lt;h3 id="子工作流">子工作流&lt;/h3>
&lt;p>除了活动之外，您还可以编写工作流以调度其他工作流作为子工作流。子工作流具有独立于启动它的父工作流的实例 ID、历史记录和状态，除了终止父工作流会终止由其创建的所有子工作流这一事实。子工作流还支持自动重试策略。&lt;/p>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#child-workflows">了解更多关于子工作流的信息。&lt;/a>&lt;/p>
&lt;h3 id="定时器和提醒">定时器和提醒&lt;/h3>
&lt;p>与 Dapr actor 相同，您可以为任何时间范围安排类似提醒的持久延迟。&lt;/p>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#durable-timers">了解更多关于工作流定时器&lt;/a>和&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-architecture/#reminder-usage-and-execution-guarantees">提醒&lt;/a>&lt;/p>
&lt;h3 id="使用-http-调用管理工作流">使用 HTTP 调用管理工作流&lt;/h3>
&lt;p>当您使用工作流代码创建应用程序并使用 Dapr 运行它时，您可以调用驻留在应用程序中的特定工作流。每个单独的工作流可以：&lt;/p>
&lt;ul>
&lt;li>通过 POST 请求启动或终止&lt;/li>
&lt;li>通过 POST 请求触发以传递命名事件&lt;/li>
&lt;li>通过 POST 请求暂停然后恢复&lt;/li>
&lt;li>通过 POST 请求从您的状态存储中清除&lt;/li>
&lt;li>通过 GET 请求查询工作流状态&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/workflow_api/">了解更多关于如何使用 HTTP 调用管理工作流的信息。&lt;/a>&lt;/p></description></item><item><title>功能和概念</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/</guid><description>&lt;p>在您已经从高层次了解了&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-overview/">工作流构建块&lt;/a>之后，让我们深入探讨 Dapr 工作流引擎和 SDK 所包含的功能和概念。Dapr 工作流在所有支持的语言中都提供了几个核心功能和概念。&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 有关工作流状态管理的更多信息，请参阅&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-architecture/">工作流架构指南&lt;/a>。

&lt;/div>

&lt;h2 id="工作流">工作流&lt;/h2>
&lt;p>Dapr 工作流是您编写的函数，用于定义一系列按特定顺序执行的任务。Dapr 工作流引擎负责调度和执行这些任务，包括管理故障和重试。如果托管工作流的应用程序在多台机器上扩展，工作流引擎还可以在多台机器上负载均衡工作流及其任务的执行。&lt;/p>
&lt;p>工作流可以调度多种类型的任务，包括：&lt;/p>
&lt;ul>
&lt;li>用于执行自定义逻辑的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#workflow-activities">活动&lt;/a>&lt;/li>
&lt;li>用于将工作流休眠任意时间长度的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#durable-timers">持久计时器&lt;/a>&lt;/li>
&lt;li>用于将较大的工作流分解为较小部分的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#child-workflows">子工作流&lt;/a>&lt;/li>
&lt;li>用于阻塞工作流直到接收到外部事件信号的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#external-events">外部事件等待器&lt;/a>。这些任务在其相应的部分中有更详细的描述。&lt;/li>
&lt;/ul>
&lt;h3 id="工作流标识">工作流标识&lt;/h3>
&lt;p>每个您定义的工作流都有一个类型名称，工作流的每次执行都需要一个唯一的_实例 ID_。工作流实例 ID 可以由您的应用程序代码生成，这在工作流对应于业务实体（如文档或作业）时很有用，或者可以是自动生成的 UUID。工作流的实例 ID 对于调试以及使用&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/workflow_api/">工作流 API&lt;/a>管理工作流非常有用。&lt;/p>
&lt;p>在任何给定时间，只能存在一个具有给定 ID 的工作流实例。然而，如果一个工作流实例完成或失败，其 ID 可以被新的工作流实例重用。但请注意，新工作流实例实际上会在配置的状态存储中替换旧的实例。&lt;/p>
&lt;h3 id="工作流重放">工作流重放&lt;/h3>
&lt;p>Dapr 工作流通过使用一种称为&lt;a href="https://learn.microsoft.com/azure/architecture/patterns/event-sourcing">事件溯源&lt;/a>的技术来维护其执行状态。工作流引擎不是将工作流的当前状态存储为快照，而是管理一个仅追加的历史事件日志，描述工作流所采取的各种步骤。当使用工作流 SDK 时，这些历史事件会在工作流“等待”计划任务的结果时自动存储。&lt;/p>
&lt;p>当工作流“等待”计划任务时，它会从内存中卸载自己，直到任务完成。一旦任务完成，工作流引擎会再次调度工作流函数运行。此时的工作流函数执行被称为_重放_。&lt;/p>
&lt;p>当工作流函数被重放时，它会从头开始再次运行。然而，当它遇到已经完成的任务时，工作流引擎不会再次调度该任务，而是：&lt;/p>
&lt;ol>
&lt;li>将已完成任务的存储结果返回给工作流。&lt;/li>
&lt;li>继续执行直到下一个“等待”点。&lt;/li>
&lt;/ol>
&lt;p>这种“重放”行为会持续到工作流函数完成或因错误而失败。&lt;/p>
&lt;p>通过这种重放技术，工作流能够从任何“等待”点恢复执行，就像它从未从内存中卸载过一样。即使是先前运行的局部变量的值也可以恢复，而无需工作流引擎了解它们存储了什么数据。这种恢复状态的能力使 Dapr 工作流具有_持久性_和_容错性_。&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 这里描述的工作流重放行为要求工作流函数代码是_确定性的_。确定性的工作流函数在提供完全相同的输入时采取完全相同的操作。&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#workflow-determinism-and-code-restraints">了解有关确定性工作流代码限制的更多信息。&lt;/a>

&lt;/div>

&lt;h3 id="无限循环和永恒工作流">无限循环和永恒工作流&lt;/h3>
&lt;p>如&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#workflow-replay">工作流重放&lt;/a>部分所述，工作流维护其所有操作的仅写事件溯源历史日志。为了避免资源使用失控，工作流必须限制其调度的操作数量。例如，确保您的工作流不会：&lt;/p>
&lt;ul>
&lt;li>在其实现中使用无限循环&lt;/li>
&lt;li>调度数千个任务。&lt;/li>
&lt;/ul>
&lt;p>您可以使用以下两种技术来编写可能需要调度极大量任务的工作流：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>使用 &lt;em>continue-as-new&lt;/em> API&lt;/strong>：&lt;br>
每个工作流 SDK 都公开了一个 &lt;em>continue-as-new&lt;/em> API，工作流可以调用该 API 以使用新的输入和历史记录重新启动自己。&lt;em>continue-as-new&lt;/em> API 特别适合实现“永恒工作流”，如监控代理，否则将使用 &lt;code>while (true)&lt;/code> 类构造实现。使用 &lt;em>continue-as-new&lt;/em> 是保持工作流历史记录小的好方法。&lt;/p></description></item><item><title>工作流模式</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-patterns/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-patterns/</guid><description>&lt;p>Dapr 工作流简化了微服务架构中复杂且有状态的协调需求。以下部分描述了几种可以从 Dapr 工作流中受益的应用程序模式。&lt;/p>
&lt;h2 id="任务链">任务链&lt;/h2>
&lt;p>在任务链模式中，工作流中的多个步骤按顺序运行，一个步骤的输出可以作为下一个步骤的输入。任务链工作流通常涉及创建一系列需要对某些数据执行的操作，例如过滤、转换和归约。&lt;/p>
&lt;img src="https://v1-18.docs.dapr.io/images/workflow-overview/workflows-chaining.png" width=800 alt="显示任务链工作流模式如何工作的图示">
&lt;p>在某些情况下，工作流的步骤可能需要在多个微服务之间进行协调。为了提高可靠性和可扩展性，您还可能使用队列来触发各个步骤。&lt;/p>
&lt;p>虽然模式简单，但实现中隐藏了许多复杂性。例如：&lt;/p>
&lt;ul>
&lt;li>如果某个微服务长时间不可用，会发生什么？&lt;/li>
&lt;li>可以自动重试失败的步骤吗？&lt;/li>
&lt;li>如果不能，如何促进先前完成步骤的回滚（如果适用）？&lt;/li>
&lt;li>除了实现细节之外，是否有办法可视化工作流，以便其他工程师可以理解它的作用和工作原理？&lt;/li>
&lt;/ul>
&lt;p>Dapr 工作流通过允许您在所选编程语言中将任务链模式简洁地实现为简单函数来解决这些复杂性，如以下示例所示。&lt;/p>












&lt;ul class="nav nav-tabs" id="tabs-0" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
 data-td-tp-persist="python" aria-controls="tabs-00-00" aria-selected="true">
 Python
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
 data-td-tp-persist="javascript" aria-controls="tabs-00-01" aria-selected="false">
 JavaScript
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-02" role="tab"
 data-td-tp-persist=".net" aria-controls="tabs-00-02" aria-selected="false">
 .NET
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-03" role="tab"
 data-td-tp-persist="java" aria-controls="tabs-00-03" aria-selected="false">
 Java
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-04-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-04" role="tab"
 data-td-tp-persist="go" aria-controls="tabs-00-04" aria-selected="false">
 Go
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-0-content">
 &lt;div class="tab-body tab-pane fade show active"
 id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
 &lt;!--python-->
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">dapr.ext.workflow&lt;/span> &lt;span style="color:#204a87;font-weight:bold">as&lt;/span> &lt;span style="color:#000">wf&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">def&lt;/span> &lt;span style="color:#000">task_chain_workflow&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">wf&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">DaprWorkflowContext&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">wf_input&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#204a87">int&lt;/span>&lt;span style="color:#000;font-weight:bold">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">try&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">result1&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">yield&lt;/span> &lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">call_activity&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">step1&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">input&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">wf_input&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">result2&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">yield&lt;/span> &lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">call_activity&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">step2&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">input&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">result1&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">result3&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">yield&lt;/span> &lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">call_activity&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">step3&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">input&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">result2&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">except&lt;/span> &lt;span style="color:#c00;font-weight:bold">Exception&lt;/span> &lt;span style="color:#204a87;font-weight:bold">as&lt;/span> &lt;span style="color:#000">e&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">yield&lt;/span> &lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">call_activity&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">error_handler&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">input&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87">str&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">e&lt;/span>&lt;span style="color:#000;font-weight:bold">))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">raise&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#000">result1&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">result2&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">result3&lt;/span>&lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">def&lt;/span> &lt;span style="color:#000">step1&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">activity_input&lt;/span>&lt;span style="color:#000;font-weight:bold">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">print&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">f&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;步骤 1: 接收到输入: &lt;/span>&lt;span style="color:#4e9a06">{&lt;/span>&lt;span style="color:#000">activity_input&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">.&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic"># 执行一些操作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">activity_input&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">+&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">def&lt;/span> &lt;span style="color:#000">step2&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">activity_input&lt;/span>&lt;span style="color:#000;font-weight:bold">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">print&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">f&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;步骤 2: 接收到输入: &lt;/span>&lt;span style="color:#4e9a06">{&lt;/span>&lt;span style="color:#000">activity_input&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">.&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic"># 执行一些操作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">activity_input&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">*&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">def&lt;/span> &lt;span style="color:#000">step3&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">activity_input&lt;/span>&lt;span style="color:#000;font-weight:bold">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">print&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">f&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;步骤 3: 接收到输入: &lt;/span>&lt;span style="color:#4e9a06">{&lt;/span>&lt;span style="color:#000">activity_input&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">.&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic"># 执行一些操作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">activity_input&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">^&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">def&lt;/span> &lt;span style="color:#000">error_handler&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">error&lt;/span>&lt;span style="color:#000;font-weight:bold">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">print&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">f&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;执行错误处理程序: &lt;/span>&lt;span style="color:#4e9a06">{&lt;/span>&lt;span style="color:#000">error&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">.&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic"># 执行一些补偿操作&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong> 工作流重试策略将在 Python SDK 的未来版本中提供。&lt;/p></description></item><item><title>工作流架构</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-architecture/</guid><description>&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-overview/">Dapr 工作流&lt;/a> 允许开发者使用多种编程语言的普通代码定义工作流。工作流引擎运行在 Dapr sidecar 内部，并协调作为应用程序一部分部署的工作流代码。本文描述了：&lt;/p>
&lt;ul>
&lt;li>Dapr 工作流引擎的架构&lt;/li>
&lt;li>工作流引擎如何与应用程序代码交互&lt;/li>
&lt;li>工作流引擎如何融入整体 Dapr 架构&lt;/li>
&lt;li>不同的工作流后端如何与工作流引擎协作&lt;/li>
&lt;/ul>
&lt;p>有关如何在应用程序中编写 Dapr 工作流的更多信息，请参见 &lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-overview/">如何：编写工作流&lt;/a>。&lt;/p>
&lt;p>Dapr 工作流引擎的内部支持来自于 Dapr 的 actor 运行时。下图展示了 Kubernetes 模式下的 Dapr 工作流架构：&lt;/p>
&lt;img src="https://v1-18.docs.dapr.io/images/workflow-overview/workflows-architecture-k8s.png" width=800 alt="展示 Kubernetes 模式下工作流架构如何工作的图示">
&lt;p>要使用 Dapr 工作流构建块，您需要在应用程序中使用 Dapr 工作流 SDK 编写工作流代码，该 SDK 内部通过 gRPC 流连接到 sidecar。这会注册工作流和任何工作流活动，或工作流可以调度的任务。&lt;/p>
&lt;p>引擎直接嵌入在 sidecar 中，并通过 &lt;a href="https://github.com/microsoft/durabletask-go">&lt;code>durabletask-go&lt;/code>&lt;/a> 框架库实现。此框架允许您更换不同的存储提供者，包括为 Dapr 创建的存储提供者，该提供者在幕后利用内部 actor。由于 Dapr 工作流使用 actor，您可以将工作流状态存储在状态存储中。&lt;/p>
&lt;h2 id="sidecar-交互">Sidecar 交互&lt;/h2>
&lt;p>当工作流应用程序启动时，它使用工作流编写 SDK 向 Dapr sidecar 发送 gRPC 请求，并根据 &lt;a href="https://grpc.io/docs/what-is-grpc/core-concepts/#server-streaming-rpc">服务器流式 RPC 模式&lt;/a> 获取工作流工作项流。这些工作项可以是从“启动一个新的 X 工作流”（其中 X 是工作流的类型）到“调度活动 Y，输入 Z 以代表工作流 X 运行”的任何内容。&lt;/p></description></item><item><title>如何：编写一个工作流</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/howto-author-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/howto-author-workflow/</guid><description>&lt;p>本文提供了如何编写由Dapr工作流引擎执行的工作流的高级概述。&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 如果您还没有尝试过，&lt;a href="https://v1-18.docs.dapr.io/zh-hans/getting-started/quickstarts/workflow-quickstart/">请尝试工作流快速入门&lt;/a>，以快速了解如何使用工作流。

&lt;/div>

&lt;h2 id="以代码形式编写工作流">以代码形式编写工作流&lt;/h2>
&lt;p>Dapr工作流逻辑是通过通用编程语言实现的，这使您可以：&lt;/p>
&lt;ul>
&lt;li>使用您喜欢的编程语言（无需学习新的DSL或YAML模式）。&lt;/li>
&lt;li>访问语言的标准库。&lt;/li>
&lt;li>构建您自己的库和抽象。&lt;/li>
&lt;li>使用调试器并检查本地变量。&lt;/li>
&lt;li>为您的工作流编写单元测试，就像应用程序逻辑的其他部分一样。&lt;/li>
&lt;/ul>
&lt;p>Dapr sidecar不加载任何工作流定义。相反，sidecar仅负责驱动工作流的执行，而所有具体的工作流任务则由应用程序的一部分来处理。&lt;/p>
&lt;h2 id="编写工作流任务">编写工作流任务&lt;/h2>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/workflow-features-concepts/#workflow-activites">工作流任务&lt;/a>是工作流中的基本工作单元，是在业务流程中被编排的任务。&lt;/p>












&lt;ul class="nav nav-tabs" id="tabs-2" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
 data-td-tp-persist="python" aria-controls="tabs-02-00" aria-selected="true">
 Python
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
 data-td-tp-persist="javascript" aria-controls="tabs-02-01" aria-selected="false">
 JavaScript
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-02" role="tab"
 data-td-tp-persist=".net" aria-controls="tabs-02-02" aria-selected="false">
 .NET
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-03" role="tab"
 data-td-tp-persist="java" aria-controls="tabs-02-03" aria-selected="false">
 Java
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-04-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-04" role="tab"
 data-td-tp-persist="go" aria-controls="tabs-02-04" aria-selected="false">
 Go
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-2-content">
 &lt;div class="tab-body tab-pane fade show active"
 id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
 &lt;!--python-->
&lt;p>定义您希望工作流执行的工作流任务。任务是一个函数定义，可以接受输入并返回输出。以下示例创建了一个名为&lt;code>hello_act&lt;/code>的任务，用于打印当前计数器的值。&lt;code>hello_act&lt;/code>是一个从&lt;code>WorkflowActivityContext&lt;/code>类派生的函数。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">def&lt;/span> &lt;span style="color:#000">hello_act&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">ctx&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">WorkflowActivityContext&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">input&lt;/span>&lt;span style="color:#000;font-weight:bold">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">global&lt;/span> &lt;span style="color:#000">counter&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">counter&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">+=&lt;/span> &lt;span style="color:#204a87">input&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">print&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">f&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;New counter value is: &lt;/span>&lt;span style="color:#4e9a06">{&lt;/span>&lt;span style="color:#000">counter&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">!&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">flush&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">True&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://github.com/dapr/python-sdk/blob/master/examples/demo_workflow/app.py#LL40C1-L43C59">查看上下文中的&lt;code>hello_act&lt;/code>工作流任务。&lt;/a>&lt;/p>

 &lt;/div>
 &lt;div class="tab-body tab-pane fade"
 id="tabs-02-01" role="tabpanel" aria-labelled-by="tabs-02-01-tab" tabindex="2">
 &lt;!--javascript-->
&lt;p>定义您希望工作流执行的工作流任务。任务被封装在实现工作流任务的&lt;code>WorkflowActivityContext&lt;/code>类中。&lt;/p></description></item><item><title>如何：管理工作流</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/howto-manage-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/howto-manage-workflow/</guid><description>&lt;p>现在您已经在应用程序中&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/howto-author-workflow/">编写了工作流及其活动&lt;/a>，您可以使用HTTP API调用来启动、终止和获取工作流的信息。有关更多信息，请阅读&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/workflow_api/">工作流API参考&lt;/a>。&lt;/p>


&lt;!--Python-->


&lt;!--JavaScript-->


&lt;!--NET-->


&lt;!--Java-->


&lt;!--Go-->


&lt;!--HTTP-->


&lt;ul class="nav nav-tabs" id="tabs-2" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
 data-td-tp-persist="python" aria-controls="tabs-02-00" aria-selected="true">
 Python
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
 data-td-tp-persist="javascript" aria-controls="tabs-02-01" aria-selected="false">
 JavaScript
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-02" role="tab"
 data-td-tp-persist=".net" aria-controls="tabs-02-02" aria-selected="false">
 .NET
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-03" role="tab"
 data-td-tp-persist="java" aria-controls="tabs-02-03" aria-selected="false">
 Java
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-04-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-04" role="tab"
 data-td-tp-persist="go" aria-controls="tabs-02-04" aria-selected="false">
 Go
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-05-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-05" role="tab"
 data-td-tp-persist="http" aria-controls="tabs-02-05" aria-selected="false">
 HTTP
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-2-content">
 &lt;div class="tab-body tab-pane fade show active"
 id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
 &lt;p>在代码中管理您的工作流。在&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/howto-author-workflow/#write-the-application">编写工作流&lt;/a>指南中的工作流示例中，工作流通过以下API在代码中注册：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>start_workflow&lt;/strong>: 启动工作流的一个实例&lt;/li>
&lt;li>&lt;strong>get_workflow&lt;/strong>: 获取工作流状态的信息&lt;/li>
&lt;li>&lt;strong>pause_workflow&lt;/strong>: 暂停或挂起一个工作流实例，稍后可以恢复&lt;/li>
&lt;li>&lt;strong>resume_workflow&lt;/strong>: 恢复一个暂停的工作流实例&lt;/li>
&lt;li>&lt;strong>raise_workflow_event&lt;/strong>: 在工作流上触发一个事件&lt;/li>
&lt;li>&lt;strong>purge_workflow&lt;/strong>: 删除与特定工作流实例相关的所有元数据&lt;/li>
&lt;li>&lt;strong>terminate_workflow&lt;/strong>: 终止或停止特定的工作流实例&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">from&lt;/span> &lt;span style="color:#000">dapr.ext.workflow&lt;/span> &lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">WorkflowRuntime&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">DaprWorkflowContext&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">WorkflowActivityContext&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">from&lt;/span> &lt;span style="color:#000">dapr.clients&lt;/span> &lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">DaprClient&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 合适的参数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">instanceId&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;exampleInstanceID&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">workflowComponent&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;dapr&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">workflowName&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;hello_world_wf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">eventName&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;event1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">eventData&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eventData&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 启动工作流&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">start_resp&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000">d&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">start_workflow&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">instance_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">instanceId&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_component&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowComponent&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">workflow_name&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowName&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">input&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">inputData&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_options&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowOptions&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 获取工作流信息&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">getResponse&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000">d&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">get_workflow&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">instance_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">instanceId&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_component&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowComponent&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 暂停工作流&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">d&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">pause_workflow&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">instance_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">instanceId&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_component&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowComponent&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 恢复工作流&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">d&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">resume_workflow&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">instance_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">instanceId&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_component&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowComponent&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 在工作流上触发一个事件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">d&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">raise_workflow_event&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">instance_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">instanceId&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_component&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowComponent&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">event_name&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">eventName&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">event_data&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">eventData&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 清除工作流&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">d&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">purge_workflow&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">instance_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">instanceId&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_component&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowComponent&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 终止工作流&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">d&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">terminate_workflow&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">instance_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">instanceId&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">workflow_component&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">workflowComponent&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-body tab-pane fade"
 id="tabs-02-01" role="tabpanel" aria-labelled-by="tabs-02-01-tab" tabindex="2">
 &lt;p>在代码中管理您的工作流。在&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/workflow/howto-author-workflow/#write-the-application">编写工作流&lt;/a>指南中的工作流示例中，工作流通过以下API在代码中注册：&lt;/p></description></item></channel></rss>