当前位置: 首页 > 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. 监…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...