2个版本

0.1.1 2020年11月23日
0.1.0 2020年10月28日

#541 in 并发

MPL-2.0 许可证

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