2个版本
0.1.1 | 2020年11月23日 |
---|---|
0.1.0 | 2020年10月28日 |
#541 in 并发
40KB
739 行
Dayger
我的上一个实验dagger[]的进化,它是第一个执行图库asyncgraph的进化。Dagger有一个使用线程池的多线程执行器,可以执行任何执行DAG。然而,确保图有意义是您的责任。
设计
图的原则是,当所有输入都准备好时,节点才会执行。节点的执行通过一个用户必须启动的执行器进行调度(见示例)。所以如果它不能继续工作,调度器将自动暂停线程,并尝试做其他事情。
每个节点都有一个“周围”的Aggregator
。它等待所有输入都准备好,执行节点,并根据当前设置的节点边将此节点的输出发送到下一个节点。
安全性
由于图可以随时更改,因此它不能像静态派发的图那样类型安全。因此,每次向节点添加边时都会检查类型。如果边没有两个连接节点的相同输入和输出类型,将抛出错误。
然而,如果边成功连接,图保证连接将持续并工作。
显然,如果您构建了一个不安全的图,输出也将是不安全的。例如,没有输入的图不会产生任何内容。同样,没有设置所有输入的节点永远不会触发。
实现自定义节点
实现自定义节点有多难?嗯,故意设计得相当简单,以下代码实现了浮点数加法。然而,这可以很容易地抽象为所有实现Add
的类型T
,如examples/math.rs
示例中所示。
struct AddFloat;
impl Node for FloatAdd{
type InSig = (f32, f32);
type OutSig = [f32; 1];
fn process(&self, input: Self::Inputs) -> Self::Outputs{
[input.0 + input.1]
}
}
日志记录
由于图总是很难,因此工具包实现了log
工具包。因此,您可以在启动时初始化一个简单的记录器,如simple_logger,并在执行期间从图中获取格式化的警告。
构建和运行
首先在您的平台上安装Rust和Cargo。
然后执行
cargo build --release
在根目录下构建库。
与所有 Rust/cargo 项目类似,可以通过以下方式执行几个示例
cargo run --example {example_name}
其中 {example_name}
可以是以下之一
- math(一些简单的计算示例)
- looping_execution(一些执行图)
- self_executing(一些使用
Executable
特性的图,用于所有没有输入的节点) - dynamic_graph(在运行时更改的图,包括或排除某些打印节点)
文档
可以通过以下方式在本地构建文档
cargo doc --open
大部分代码都有文档。
许可证
整个项目受 Mozilla 公共许可证,版本 2.0 的许可
此许可证的版本包含在存储库中,并在每个代码文件的顶部有通知。
依赖项
~585KB