6 个稳定版本
2.0.2 | 2024年2月23日 |
---|---|
1.1.4 | 2024年2月23日 |
0.3.0 |
|
0.2.2 |
|
0.1.0 |
|
#835 in 异步
33KB
188 代码行
简介
一个使用异步方法的 struct,用于记录异步任务的执行状态。
函数
- 能够托管
Future
并查询它们是否 未找到、成功、失败 或 正在运行。 - 能够托管
Future
来撤销已成功的Future
并使它们 未找到。
依赖项
- 依赖于带有功能
rt
的tokio
,因此不能使用其他异步运行时。 - 依赖于 scc 以实现异步
HashSet
。
在以下情况下使用此 crate
- 易于为未来(任务)生成一个 唯一 的
task_id
(不一定是String
)。 - 不希望具有相同
task_id
的任务成功超过一次。 - 想要记录和查询所有成功任务和失败任务。
- 想要以相同状态处理每个任务(而不仅仅是关注一个状态)。
- 需要可线性化的查询。
- 想要撤销一个任务,并且不希望撤销操作成功超过一次。
示例.
记录器只能使用一种 task_id
类型。 task_id
的类型应该是
Eq +Hash+ Clone + Send + Sync + 'static
- 便宜克隆(有时可以使用
Arc
)。
使用方法
通过 launch
使用一个 唯一 的 task_id
和一个 Future
启动一个任务。
通过 query_task_state
或 query_task_state_quick
使用任务的 task_id
查询任务的状态。
通过 revoke_task_block
使用任务的 task_id
和一个 Future
撤销任务。
技能
请记住,您可以在 Future
中添加任何内容以实现您想要的功能。例如
- 在
Future
中处理您的Result
,然后返回空结果Result<(),()>
。 - 在
Future
的末尾向单次通道发送消息,通知上层“此任务完成”。不要忘记考虑当通道可能无法立即发送时使用tokio::spawn
。 - 设置其他回调函数。
将任务元数据存储在外部 scc::HashMap
(task_id
-> metadata) 中仍然很高效。
如有疑问,请直接查看源代码(约150行)。
何时不应使用此包
此包中所有操作的消费和克隆次数约为使用 scc::Hashmap
实现的 2 到 3 倍。
此包使用 三个 HashSet
来简化对所有处于相同状态的任务的操作,并且使用另外两个 HashSet
来支持查询的线性化和撤销操作。
请注意,随着大小的增加,scc
的容器在 单次 访问时争用较少。
因此,如果您不需要操作处于相同状态的所有任务,则只需使用 scc::HashMap
(task_id
-> task_status
) 来构建一个更简单的实现,这可能会减少争用和克隆,但迭代会更昂贵。而且 scc::HashMap::update_async
可以是原子操作的有力工具。
如果您只想处理一个状态的所有任务,也应避免使用此包。例如,如果您只想管理失败的任务,则应使用 scc::HashMap
来记录任务状态,并在 Future
中将失败的任务插入到外部的 Arc<scc::HashSet>
中。
版本低于 1.1.1 存在错误。
有关更多用法、特性和证明,请参阅文档。
依赖项
~2.9–4MB
~65K SLoC