26个版本 (12个重大变更)

0.13.2 2024年3月10日
0.12.0 2024年1月3日
0.10.0 2023年12月28日
0.9.0 2023年11月27日
0.1.0 2021年12月11日

#3#batch

Download history 90/week @ 2024-04-22 65/week @ 2024-04-29 81/week @ 2024-05-06 47/week @ 2024-05-13 79/week @ 2024-05-20 93/week @ 2024-05-27 74/week @ 2024-06-03 61/week @ 2024-06-10 46/week @ 2024-06-17 72/week @ 2024-06-24 163/week @ 2024-07-01 20/week @ 2024-07-08 92/week @ 2024-07-15 56/week @ 2024-07-22 118/week @ 2024-07-29 70/week @ 2024-08-05

每月下载336次
26 个crate中使用 (4个直接使用)

MIT/Apache

285KB
6.5K SLoC

🧬 fn_graph

Crates.io docs.rs CI Coverage Status

动态管理函数图执行。

此crate提供了一个FnGraph,用户可以注册一系列函数及其依赖关系。然后,图可以返回一个函数流,以顺序或并发方式迭代。函数所需的任何数据依赖都保证不会根据借用规则发生冲突。

此外,函数的类型不限于闭包和函数,任何实现了FnResFnMeta trait的类型都可以。

用法

将以下内容添加到Cargo.toml

fn_graph = "0.13.2"

# Integrate with `fn_meta` / `interruptible` / `resman`
fn_graph = { version = "0.13.2", features = ["fn_meta"] }
fn_graph = { version = "0.13.2", features = ["interruptible"] }
fn_graph = { version = "0.13.2", features = ["resman"] }
fn_graph = { version = "0.13.2", features = ["fn_meta", "interruptible", "resman"] }

原因

假设有三个任务,每个任务代表一个函数。每个函数需要不同的数据

函数 数据
f1 &a, &b
f2 &a, &b, &mutc
f3 &muta, &b, &mutc

在安排并行执行时,可以并行执行f1f2,因为数据ab以不可变方式访问,而c仅由b独占访问。f3不能与f1f2并行执行,因为它需要独占访问ac

对于少量函数和数据,手动编写代码来安排函数执行是可行的。然而,随着函数和数据数量的增加,其复杂性也随之增加,因此希望由代码来管理此类样板代码。

注意

运行时管理数据依赖任务图的概念来自shredfn_graph的实现有以下不同之处

  • 不同的API易用性和灵活性权衡。

    • 以函数和闭包作为输入,而不是以System实现作为输入。

    • 参数从函数签名中检测,而不是从 SystemData 实现中检测,但参数数量有限为8个。(手动 SystemData 实现没有限制)

    • 返回类型是类型参数化的,而不是 ()

  • 不是通过将函数按阶段分组来管理数据访问冲突,而是 fn_graph 保存逻辑和数据依赖的依赖图,并在前面的函数完成后执行函数。

    这允许后续具有数据依赖的函数等待时间略短,因为每个函数可以在其前辈完成后开始,而阶段方法可能包含仍在执行的其他函数,这阻止了下一阶段的函数开始执行。

另请参阅

  • fn_meta:在运行时返回有关函数的元数据。
  • interruptible:支持可中断流。
  • resman:运行时管理的资源借用。
  • shred:共享资源调度器。

许可证

根据您选择以下之一进行许可

由您选择。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交给作品并有意包含在内的任何贡献,都应双重许可如上所述,不附加任何额外条款或条件。

依赖项

~4–6MB
~91K SLoC