#async-task #async #tokio #query #lock-free #record

async_tasks_recorder

使用异步方法记录异步任务执行状态的 struct

6 个稳定版本

2.0.2 2024年2月23日
1.1.4 2024年2月23日
0.3.0 2024年2月21日
0.2.2 2024年2月21日
0.1.0 2024年2月19日

#835 in 异步

MIT/Apache

33KB
188 代码行

简介

一个使用异步方法的 struct,用于记录异步任务的执行状态。

函数

  • 能够托管 Future 并查询它们是否 未找到成功失败正在运行
  • 能够托管 Future 来撤销已成功的 Future 并使它们 未找到

依赖项

  • 依赖于带有功能 rttokio,因此不能使用其他异步运行时。
  • 依赖于 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_statequery_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