An open API service indexing awesome lists of open source software.

https://github.com/symphony09/ograph

【Go DAG Schedule Framework】A simple way to build a pipeline with Go.
https://github.com/symphony09/ograph

cgraph dag framework golang graph parallel-computing pipeline taskflow workflow-engine

Last synced: 2 months ago
JSON representation

【Go DAG Schedule Framework】A simple way to build a pipeline with Go.

Awesome Lists containing this project

README

          

________________ ______
__ __ \_ ____/____________ ___________ /_
_ / / / / __ __ ___/ __ `/__ __ \_ __ \
/ /_/ // /_/ / _ / / /_/ /__ /_/ / / / /
\____/ \____/ /_/ \__,_/ _ .___//_/ /_/
/_/

# OGraph: A simple way to build a pipeline with Go

[![Go Report Card](https://goreportcard.com/badge/github.com/symphony09/ograph)](https://goreportcard.com/report/github.com/symphony09/ograph)
[![codecov](https://codecov.io/github/symphony09/ograph/graph/badge.svg?token=TR5UR9L6Y8)](https://codecov.io/github/symphony09/ograph)
[![Go Reference](https://pkg.go.dev/badge/github.com/symphony09/ograph.svg)](https://pkg.go.dev/github.com/symphony09/ograph)
[![DeepWiki](https://img.shields.io/badge/DeepWiki-symphony09%2Fograph-blue.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==)](https://deepwiki.com/symphony09/ograph)

[中文](README.md) | [English](README_en.md)

**OGraph** 是一个用 `Go` 实现的图流程执行框架。

你可以通过构建`Pipeline`(流水线),来控制依赖元素依次顺序执行、非依赖元素并发执行的调度功能。

此外,**OGraph** 还提供了丰富的重试,超时限制,执行追踪等开箱即用的特征。

## 同类项目对比

**OGraph** 受启发于另一个 `C++`项目 [CGraph](https://github.com/ChunelFeng/CGraph)。但 OGraph 并不等于 Go 版本的 CGraph。

### 功能对比

和 CGraph 一样,OGraph 也提供基本的构图和调度执行能力,但有以下几点关键不同:

* 用 Go 实现,使用协程而非线程进行调度,更轻量灵活

* 支持通过 Wrapper 来自定义循环、执行条件判断、错误处理等逻辑,并可以随意组合

* 支持导出图结构,再在别处导入执行(符合限制的情况下)

* 灵活的虚节点设置,用以简化依赖关系

### 性能对比

经过 Benchmark 测试,OGraph 性能优于 CGraph。

[CGraph 性能测试参考](http://www.chunel.cn/archives/cgraph-compare-taskflow-v1)

[OGraph 性能测试参考](docs/benchmark_report.md)

| | CGraph(基准) | OGraph(本项目) |
| :----------------------- | :------------- | :------------------- |
| 场景一(无连接32节点) | 8204 ns/op | 4308 ns/op(+90.4%) |
| 场景二(串行连接32节点) | 572 ns/op | 281.7 ns/op(+103%) |
| 场景三(简单DAG 6节点) | 4042 ns/op | 2762 ns/op(+46.3%) |
| 场景四(8x8全连接) | 13450 ns/op | 8333 ns/op(+61.4%) |

## 快速开始

### 第一步:声明一个 Node 接口实现

```go
type Person struct {
ograph.BaseNode
}

func (person *Person) Run(ctx context.Context, state ogcore.State) error {
fmt.Printf("Hello, i am %s.\n", person.Name())
return nil
}
```

上面代码中 Person 组合了 BaseNode,并覆写了 Node 接口方法 Run。

### 第二步:构建一个 Pipeline 并运行

```go
func TestHello(t *testing.T) {
pipeline := ograph.NewPipeline()

zhangSan := ograph.NewElement("ZhangSan").UseNode(&Person{})
liSi := ograph.NewElement("LiSi").UseNode(&Person{})

pipeline.Register(zhangSan).
Register(liSi, ograph.Rely(zhangSan))

if err := pipeline.Run(context.TODO(), nil); err != nil {
t.Error(err)
}
}
```

上面代码在 pipeline 中注册了两个 Person 节点(zhangSan、liSi),并指定 liSi 依赖于 zhangSan。

输出结果

Hello, i am ZhangSan.
Hello, i am LiSi.

## 更多文档

请前往 [https://symphony09.github.io/ograph-docs](https://symphony09.github.io/ograph-docs/zh/docs/quick-start/) 查看更多文档!