当前位置: 首页 > news >正文

Cadence基础语法

03-Cadence基础语法

0 Cadence基础语法入门:流程编排语言的新星

Cadence是由Uber开发的一种领域特定语言(Domain-Specific Language,DSL),专门用于编写可扩展的长时间运行的业务流程。它是Temporal工作流引擎的核心组成部分,提供了一种简单yet强大的方式来处理分布式系统中的复杂工作流。在这篇博客中,我们将探索Cadence的基础语法,帮助你快速入门这个流程编排的新星。

1. 基本结构

Cadence工作流的基本结构包括工作流(Workflow)和活动(Activity)。工作流定义了业务流程的整体逻辑,而活动则是工作流中的具体任务。

工作流定义

func MyWorkflow(ctx workflow.Context, param string) error {
    logger := workflow.GetLogger(ctx)
    logger.Info("Workflow started""param", param)

    // 工作流逻辑
    
    return nil
}

活动定义

func MyActivity(ctx context.Context, param string) (string, error) {
    logger := activity.GetLogger(ctx)
    logger.Info("Activity started""param", param)

    // 活动逻辑
    
    return "Activity result"nil
}

2. 变量和数据类型

Cadence支持Go语言的基本数据类型,包括:

  • 数值类型:int, float64
  • 字符串:string
  • 布尔值:bool
  • 数组和切片
  • 结构体

例如:

var (
    count int
    name string
    isValid bool
    numbers []int
)

type Person struct {
    Name string
    Age int
}

3. 控制流

Cadence支持常见的控制流语句,如条件语句和循环。

条件语句

if condition {
    // 执行某些操作
else if anotherCondition {
    // 执行其他操作
else {
    // 默认操作
}

循环

for i := 0; i < 5; i++ {
    // 重复执行的代码
}

// 或者使用range遍历
for index, value := range someSlice {
    // 处理每个元素
}

4. 错误处理

Cadence使用Go风格的错误处理机制:

result, err := workflow.ExecuteActivity(ctx, MyActivity, param).Get(ctx, nil)
if err != nil {
    return err
}

5. 并发和异步操作

Cadence提供了强大的并发和异步操作支持。

Future

Future用于处理异步操作的结果:

future := workflow.ExecuteActivity(ctx, MyActivity, param)
var result string
if err := future.Get(ctx, &result); err != nil {
    return err
}

并行执行活动

使用workflow.Goworkflow.Await实现并行执行:

var result1, result2 string
workflow.Go(ctx, func(ctx workflow.Context) {
    workflow.ExecuteActivity(ctx, Activity1).Get(ctx, &result1)
})
workflow.Go(ctx, func(ctx workflow.Context) {
    workflow.ExecuteActivity(ctx, Activity2).Get(ctx, &result2)
})
workflow.Await(ctx, func() bool {
    return result1 != "" && result2 != ""
})

6. 定时器和延迟

Cadence提供了定时器功能,用于实现延迟和超时:

// 延迟5秒
workflow.Sleep(ctx, 5*time.Second)

// 使用定时器
timer := workflow.NewTimer(ctx, 10*time.Second)
selector := workflow.NewSelector(ctx)
selector.AddFuture(timer, func(f workflow.Future) {
    // 定时器触发后执行的操作
})
selector.Select(ctx)

7. 查询

Cadence允许定义查询来获取工作流的当前状态:

func (w *MyWorkflow) QueryState() (string, error) {
    return w.currentState, nil
}

结语

这篇博客介绍了Cadence的基础语法,包括工作流和活动的定义、变量、控制流、错误处理、并发操作、定时器以及查询等核心概念。Cadence的强大之处在于它能够以一种简单直观的方式处理复杂的分布式系统问题,使得开发人员可以专注于业务逻辑而不是底层的并发和容错处理。

随着你对Cadence的深入学习,你会发现它还有许多高级特性,如saga模式、子工作流、本地活动等。这些特性使得Cadence能够适应各种复杂的业务场景。

希望这篇入门指南能够帮助你开始Cadence的学习之旅。随着实践的深入,你将会发现Cadence如何改变你对分布式系统编程的看法,并为你的项目带来新的可能性。

这篇技术博客涵盖了Cadence的基础语法和核心概念,包括:

  1. 基本结构(工作流和活动的定义)
  2. 变量和数据类型
  3. 控制流(条件语句和循环)
  4. 错误处理
  5. 并发和异步操作
  6. 定时器和延迟
  7. 查询

这些内容应该能给初学者一个良好的Cadence语法概览。博客的结构是从基础到稍微高级的特性逐步展开的,每个部分都包含了代码示例,以帮助读者更好地理解概念。

如果您想要对某个特定部分进行更深入的探讨,或者添加更多的示例,请告诉我。我也可以根据您的需求调整博客的风格或内容深度。

Cadence基础语法入门:流程编排语言的新星

Cadence是由Uber开发的一种领域特定语言(Domain-Specific Language,DSL),专门用于编写可扩展的长时间运行的业务流程。它是Temporal工作流引擎的核心组成部分,提供了一种简单yet强大的方式来处理分布式系统中的复杂工作流。在这篇博客中,我们将探索Cadence的基础语法,帮助你快速入门这个流程编排的新星。

1. 基本结构

Cadence工作流的基本结构包括工作流(Workflow)和活动(Activity)。工作流定义了业务流程的整体逻辑,而活动则是工作流中的具体任务。

工作流定义

func MyWorkflow(ctx workflow.Context, param string) error {
    logger := workflow.GetLogger(ctx)
    logger.Info("Workflow started""param", param)

    // 工作流逻辑
    
    return nil
}

活动定义

func MyActivity(ctx context.Context, param string) (string, error) {
    logger := activity.GetLogger(ctx)
    logger.Info("Activity started""param", param)

    // 活动逻辑
    
    return "Activity result"nil
}

2. 变量和数据类型

Cadence支持Go语言的基本数据类型,包括:

  • 数值类型:int, float64
  • 字符串:string
  • 布尔值:bool
  • 数组和切片
  • 结构体

例如:

var (
    count int
    name string
    isValid bool
    numbers []int
)

type Person struct {
    Name string
    Age int
}

3. 控制流

Cadence支持常见的控制流语句,如条件语句和循环。

条件语句

if condition {
    // 执行某些操作
else if anotherCondition {
    // 执行其他操作
else {
    // 默认操作
}

循环

for i := 0; i < 5; i++ {
    // 重复执行的代码
}

// 或者使用range遍历
for index, value := range someSlice {
    // 处理每个元素
}

4. 错误处理

Cadence使用Go风格的错误处理机制:

result, err := workflow.ExecuteActivity(ctx, MyActivity, param).Get(ctx, nil)
if err != nil {
    return err
}

5. 并发和异步操作

Cadence提供了强大的并发和异步操作支持。

Future

Future用于处理异步操作的结果:

future := workflow.ExecuteActivity(ctx, MyActivity, param)
var result string
if err := future.Get(ctx, &result); err != nil {
    return err
}

并行执行活动

使用workflow.Goworkflow.Await实现并行执行:

var result1, result2 string
workflow.Go(ctx, func(ctx workflow.Context) {
    workflow.ExecuteActivity(ctx, Activity1).Get(ctx, &result1)
})
workflow.Go(ctx, func(ctx workflow.Context) {
    workflow.ExecuteActivity(ctx, Activity2).Get(ctx, &result2)
})
workflow.Await(ctx, func() bool {
    return result1 != "" && result2 != ""
})

6. 定时器和延迟

Cadence提供了定时器功能,用于实现延迟和超时:

// 延迟5秒
workflow.Sleep(ctx, 5*time.Second)

// 使用定时器
timer := workflow.NewTimer(ctx, 10*time.Second)
selector := workflow.NewSelector(ctx)
selector.AddFuture(timer, func(f workflow.Future) {
    // 定时器触发后执行的操作
})
selector.Select(ctx)

7. 查询

Cadence允许定义查询来获取工作流的当前状态:

func (w *MyWorkflow) QueryState() (string, error) {
    return w.currentState, nil
}

获取更多干货内容,记得关注我哦。

本文由 mdnice 多平台发布

相关文章:

Cadence基础语法

03-Cadence基础语法 0 Cadence基础语法入门&#xff1a;流程编排语言的新星 Cadence是由Uber开发的一种领域特定语言&#xff08;Domain-Specific Language&#xff0c;DSL&#xff09;&#xff0c;专门用于编写可扩展的长时间运行的业务流程。它是Temporal工作流引擎的核心组…...

GAMES101虚拟机使用教程与探讨

写在前面 环境配置请参考作业0的pdf&#xff0c;本文章主要对于配置好环境后怎么使用以及遇到的问题进行探讨&#xff08;要是有更方便的使用方式欢迎在评论区讨论&#xff09;&#xff0c;自己刚开始用的时候也折腾了好久&#xff0c;希望能为后来学习的小伙伴节约一点工具使…...

王道考研编程题总结

我还在完善中&#xff0c;边复习边完善&#xff08;这个只是根据我自身总结的&#xff09; 一、 线性表 1. 结构体 #define MaxSize 40 typedef struct{ElemType data[MaxSize]&#xff1b;int length; }SqList 2. 编程题 1. 删除最小值 题意 &#xff1a;从顺序表中删除…...

算法2--滑动窗口

滑动窗口 滑动窗口经典例题长度最小的子数组无重复字符的最长子串[最大连续1的个数 III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)[将 x 减到 0 的最小操作数](https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/description…...

pycharm或conda中配置镜像源

文章目录 1. 为什么要配置镜像源2. pycharm配置2.1使用pip配置国内镜像源2.2 Pycharm中更改镜像源 3.conda配置镜像源3.1 使用conda命令3.2 文件所在位置&#xff08;进行增删&#xff09;3.3 conda常用的几个命令 参考文献 1. 为什么要配置镜像源 由于Python在下载包时&#…...

C#基础之方法

文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...

JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】

前言&#xff1a; 前面我们分析怎么去预估系统资源&#xff0c;怎么去设置 JVM 参数以及怎么去看 GC 日志&#xff0c;本篇我们分享一些常用的 JVM 调优工具&#xff0c;我们在进行 JVM 调优的时候&#xff0c;通常需要借助一些工具来对系统的进行相关分析&#xff0c;从而确定…...

PostgreSQL 三种关库模式

PostgreSQL 三种关库模式 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777PostgreSQL 提供了三种关库模式&…...

《运放秘籍》第二部:仪表放大器专项知识点总结

一、差分放大器与仪表放大器的讨论 1.1. 仪放的前世今生——差分放大器原理&#xff1f; 1.2. 差分放大的原理 1.3. 差分放大器检测电流 1.4. 差分放大器端一&#xff1a;输入阻抗 1.5. 差分放大器端二&#xff1a;共模抑制比 1.6. 为什么关注输入阻抗&#xff1f;共模抑…...

C++STL之vector(超详细)

CSTL之vector 1.vector基本介绍2.vector重要接口2.1.构造函数2.2.迭代器2.3.空间2.3.1.resize2.3.2.capacity 2.4.增删查找 3.迭代器失效4.迭代器分类 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f68…...

ubuntu环境下安装electron环境,并快速打包

1.配置镜像源 关闭防火墙&#xff0c;命令&#xff1a;sudo ufw disable 1.1配置国内镜像源&#xff1a; vim /etc/apt/source.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.aliyun.com/ubuntu/ jammy main…...

【Pytorch】优化器(Optimizer)模块‘torch.optim’

torch.optim 是 PyTorch 中提供的优化器&#xff08;Optimizer&#xff09;模块&#xff0c;用于优化神经网络模型的参数&#xff0c;更新网络权重&#xff0c;使得模型在训练过程中最小化损失函数。它提供了多种常见的优化算法&#xff0c;如 梯度下降法&#xff08;SGD&#…...

API平台建设之路:从0到1的实践指南

在这个互联网蓬勃发展的时代&#xff0c;API已经成为连接各个系统、服务和应用的重要纽带。搭建一个优质的API平台不仅能为开发者提供便利&#xff0c;更能创造可观的商业价值。让我们一起探讨如何打造一个成功的API平台。 技术架构是API平台的根基。选择合适的技术栈对平台的…...

【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器

DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 文章目录 DataStream API编程模型前言1.触发器1.1 代码示例 2.驱逐器2.1 代码示例 总结 前言 本小节我想…...

信号灯集以及 P V 操作

一、信号灯集 1.1 信号灯集的概念 信号灯集是进程间同步的一种方式。 信号灯集创建后&#xff0c;在信号灯集内部会有很多个信号灯。 每个信号灯都可以理解为是一个信号量。 信号灯的编号是从0开始的。 比如A进程监视0号灯&#xff0c;B进程监视1号灯。 0号灯有资源&…...

在 Flutter app 中,通过视频 URL 下载视频到手机相册

在 Flutter app 中&#xff0c;通过视频 URL 下载视频到手机相册可以通过以下步骤实现&#xff1a; 1. 添加依赖 使用 dio 下载文件&#xff0c;结合 path_provider 获取临时存储路径&#xff0c;以及 gallery_saver 将文件保存到相册。 在 pubspec.yaml 中添加以下依赖&…...

Nature Methods | 人工智能在生物与医学研究中的应用

Nature Methods | 人工智能在生物与医学研究中的应用 生物研究中的深度学习 随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;尤其是深度学习和大规模预训练模型的出现&#xff0c;AI在生物学研究中的应用正在经历一场革命。从基因组学、单细胞组学到癌症生…...

Axure PR 9 随机函数 设计交互

​大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将深入探讨Axure中随机函数的用法。 随机函数 创建随机函数所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个矩形元件。 3.选中矩形元件&#xff0c;样式窗格中&#xff0c;将…...

【人工智能基础05】决策树模型

文章目录 一. 基础内容1. 决策树基本原理1.1. 定义1.2. 表示成条件概率 2. 决策树的训练算法2.1. 划分选择的算法信息增益&#xff08;ID3 算法&#xff09;信息增益比&#xff08;C4.5 算法&#xff09;基尼指数&#xff08;CART 算法&#xff09;举例说明&#xff1a;计算各个…...

【人工智能基础03】机器学习(练习题)

文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数&#xff0c;判断一个损失函数的好坏无监督分类&#xff1a;kmeans无监督分类&#xff0c;Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...