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
每月下载336次
在 26 个crate中使用 (4个直接使用)
285KB
6.5K SLoC
🧬 fn_graph
动态管理函数图执行。
此crate提供了一个FnGraph
,用户可以注册一系列函数及其依赖关系。然后,图可以返回一个函数流,以顺序或并发方式迭代。函数所需的任何数据依赖都保证不会根据借用规则发生冲突。
此外,函数的类型不限于闭包和函数,任何实现了FnRes
和FnMeta
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 |
在安排并行执行时,可以并行执行f1
和f2
,因为数据a
和b
以不可变方式访问,而c
仅由b
独占访问。f3
不能与f1
或f2
并行执行,因为它需要独占访问a
和c
。
对于少量函数和数据,手动编写代码来安排函数执行是可行的。然而,随着函数和数据数量的增加,其复杂性也随之增加,因此希望由代码来管理此类样板代码。
注意
运行时管理数据依赖任务图的概念来自shred
;fn_graph
的实现有以下不同之处
-
不同的API易用性和灵活性权衡。
-
以函数和闭包作为输入,而不是以
System
实现作为输入。 -
参数从函数签名中检测,而不是从
SystemData
实现中检测,但参数数量有限为8个。(手动SystemData
实现没有限制) -
返回类型是类型参数化的,而不是
()
。
-
-
不是通过将函数按阶段分组来管理数据访问冲突,而是
fn_graph
保存逻辑和数据依赖的依赖图,并在前面的函数完成后执行函数。这允许后续具有数据依赖的函数等待时间略短,因为每个函数可以在其前辈完成后开始,而阶段方法可能包含仍在执行的其他函数,这阻止了下一阶段的函数开始执行。
另请参阅
fn_meta
:在运行时返回有关函数的元数据。interruptible
:支持可中断流。resman
:运行时管理的资源借用。shred
:共享资源调度器。
许可证
根据您选择以下之一进行许可
- Apache License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交给作品并有意包含在内的任何贡献,都应双重许可如上所述,不附加任何额外条款或条件。
依赖项
~4–6MB
~91K SLoC