Chinese Readme | English Readme | deepwiki
CGraph is a cross-platform Directed Acyclic Graph framework based on pure C++ without any 3rd-party dependencies.
You, with it, can build your own operators simply, and describe any running schedules as you need, such as dependence, parallelling, aggregation, conditional and so on. Python APIs are also supported to build your pipeline.
Tutorials and contact information are shown as follows. Please get in touch with us for free if you need more about this repository.
The Chinese name of CGraph is "Se丶Tu". It is a cross-platform graph flow execution framework without any third-party dependencies. Through the underlying scheduling of GPipeline, it provides eDAG scheduling features including sequential execution of dependent elements, concurrent execution of independent elements, pause, resume, and timeout settings.
Users only need to inherit from the GNode class, implement the run() method in the subclass, and set dependencies as needed to execute tasks as a graph or as a pipeline. Users can also configure different GGroups containing multiple nodes to control conditional judgment, loop, and concurrent execution logic by themselves.
This project is written with only the C++11 standard library and has no third-party dependencies. It is compatible with MacOS, Linux, Windows, and Android. It supports local compilation and secondary development, and also provides a Python version: pycgraph. For compilation and installation, please refer to CGraph Compile Guide
For detailed feature introductions and usage, please refer to the articles on Chunel's Blog. Related videos are continuously updated on Bilibili. Welcome to watch and discuss:
- Bilibili Video: CGraph Getting Started
- Bilibili Video: CGraph Features
- A complete introduction to all terms and feature modules in the CGraph project
- Detailed explanations of each feature's usage scenarios, usage methods, and solved problems with real coding processes
- Suitable for users who want to fully understand CGraph features and get started quickly
- Suitable for users interested in multithreaded programming
- Bilibili Video: CGraph Applications
- Bilibili Video: CGraph Sharing
C++ Version
#include "CGraph.h"
using namespace CGraph;
class MyNode1 : public GNode {
public:
CStatus run() override {
printf("[%s], sleep for 1 second ...\n", this->getName().c_str());
CGRAPH_SLEEP_SECOND(1)
return CStatus();
}
};
class MyNode2 : public GNode {
public:
CStatus run() override {
printf("[%s], sleep for 2 second ...\n", this->getName().c_str());
CGRAPH_SLEEP_SECOND(2)
return CStatus();
}
};
int main() {
/* Create a pipeline for configuring and executing graph flow information */
GPipelinePtr pipeline = GPipelineFactory::create();
GElementPtr a, b, c, d = nullptr;
/* Register dependencies between nodes */
pipeline->registerGElement<MyNode1>(&a, {}, "nodeA");
pipeline->registerGElement<MyNode2>(&b, {a}, "nodeB");
pipeline->registerGElement<MyNode1>(&c, {a}, "nodeC");
pipeline->registerGElement<MyNode2>(&d, {b, c}, "nodeD");
/* Execute the graph flow framework */
pipeline->process();
/* Clear all resources in the pipeline */
GPipelineFactory::remove(pipeline);
return 0;
}
As shown above, when the graph structure is executed, node a runs first. After node a finishes, nodes b and c run in parallel. After both b and c finish, node d runs.
Python Version
import time
from datetime import datetime
from pycgraph import GNode, GPipeline, CStatus
class MyNode1(GNode):
def run(self):
print("[{0}] {1}, enter MyNode1 run function. Sleep for 1 second ... ".format(datetime.now(), self.getName()))
time.sleep(1)
return CStatus()
class MyNode2(GNode):
def run(self):
print("[{0}] {1}, enter MyNode2 run function. Sleep for 2 second ... ".format(datetime.now(), self.getName()))
time.sleep(2)
return CStatus()
if __name__ == '__main__':
pipeline = GPipeline()
a, b, c, d = MyNode1(), MyNode2(), MyNode1(), MyNode2()
pipeline.registerGElement(a, set(), "nodeA")
pipeline.registerGElement(b, {a}, "nodeB")
pipeline.registerGElement(c, {a}, "nodeC")
pipeline.registerGElement(d, {b, c}, "nodeD")
pipeline.process()Other Versions
- CsCGraph : A CSharp native, CGraph-API-liked DAG project
- JaCGraph : A Java native, CGraph-API-liked DAG project
- GoCGraph : A Go native, CGraph-API-liked DAG project
- CGraph-lite : A one-header-only, CGraph-API-liked DAG project, lite version by C++
- A simple implementation of a graph framework - execution logic
- A simple implementation of a graph framework - loop logic
- A simple implementation of a graph framework - parameter passing
- A simple implementation of a graph framework - conditional judgment
- A simple implementation of a graph framework - aspect-oriented extension
- A simple implementation of a graph framework - function injection
- A simple implementation of a graph framework - message mechanism
- A simple implementation of a graph framework - event triggering
- A simple implementation of a graph framework - timeout mechanism
- A simple implementation of a graph framework - thread pool optimization (1)
- A simple implementation of a graph framework - thread pool optimization (2)
- A simple implementation of a graph framework - thread pool optimization (3)
- A simple implementation of a graph framework - thread pool optimization (4)
- A simple implementation of a graph framework - thread pool optimization (5)
- A simple implementation of a graph framework - thread pool optimization (6)
- A simple implementation of a graph framework - performance optimization (1)
- A simple implementation of a graph framework - performance optimization (2)
- A simple implementation of a graph framework - distance calculation
- CGraph theme song - Listen to the Coder
- Talking about the year I spent writing CGraph
- What is it like to lead an awesome-cpp project from scratch?
- Explosive! After CGraph performance fully surpasses taskflow, the author says he wants more...
- Optimizing graphs with graphs: ideas for calculating the maximum DAG parallelism in CGraph
- One article to understand CGraph after two and a half years of practice
- The CGraph author wants to know whether you need an eDAG scheduling framework
- Reducing edges and improving efficiency: summary of redundant edge pruning in CGraph
- Latest coding-world feel-good story: reborn as someone writing CGraph abroad (Python version)
- Building the CGraph I once did not dare to imagine
- GraphANNS : Graph-based Approximate Nearest Neighbor Search Working off CGraph
- CThreadPool : A simple, easy-to-use, powerful, high-performance, cross-platform C++ thread pool
- PyCGraph-example : A useful list of how cool to use PyCGraph
- awesome-cpp : A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny things. Inspired by awesome-... stuff.
- awesome-workflow-engines : A curated list of awesome open source workflow engines
- taskflow : A General-purpose Parallel and Heterogeneous Task Programming System
- torchpipe : Serving Inside Pytorch
- nndeploy : Easy-to-use, high-performance, multi-platform inference deployment framework
- KuiperInfer : A step-by-step guide to building a high-performance deep learning inference library, supporting inference for large models such as llama2, Unet, Yolov5, and Resnet. Implement a high-performance deep learning inference library step by step
- OGraph : A simple way to build a pipeline with Go.
- incubator-hugegraph-ai : The integration of HugeGraph with AI/LLM & GraphRAG
- pybind11 : Seamless operability between C++11 and Python
- The Python API binding feature of this project is implemented with pybind11
- Bilibili Video: pybind11 practical implementation - how PyCGraph was built | Feishu document link

