#async-task #task #async #tokio #query #record

async_tasks_state_map

用于记录异步任务执行状态的struct

5个版本 (1个稳定版)

1.0.1 2024年2月27日
0.2.0 2024年2月24日
0.1.2 2024年2月24日
0.1.1 2024年2月24日
0.1.0 2024年2月24日

#956 in 异步

MIT/Apache

16KB
214

简介

用于记录异步方法中异步任务执行状态的struct。

函数

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

依赖

  • 依赖于tokiort特性,因此不能使用其他异步运行时。
  • 依赖于scc以使用异步HashMap

在以下情况下使用此crate:

  • 易于为未来(任务)生成一个唯一的task_id(不一定是String)。
  • 不希望具有相同task_id的任务成功超过一次。
  • 需要线性化
  • 想要撤销任务,并且不希望撤销操作成功超过一次。

记录器只能使用单一类型的task_id。应使用以下类型的task_id

  • Eq +Hash+ Clone + Send + Sync + 'static
  • 克隆成本低(有时可以使用Arc)(仅在启动时克隆一次)。

async_tasks_recorder是另一种基于HashSet的实现,它更容易遍历同一状态中的所有任务。但是,如果您只关注迭代单个状态,则不应使用该crate。相反,您可以将处于特定状态的任务收集到外部的Arc<HashSet>中。

状态转换图

    ┌------- Revoking ←-----┐
    ↓                       |
NotFound --> Working --> Success
               ↑ |
               | ↓
             Failed
  • 只能在NotFoundFailed时启动。
  • 只能在Success时撤销。

建议

简化的状态转换图

  • 在某些情况下,NotFound可以等同于Failed
  • 在大多数情况下,Revoking可以等同于Success

因此,您可能会得到

    ┌----------------------┐
    ↓                      |
Failed <--> Working --> Success

为什么或为什么不使用Arc来存储task_id

如果您不使用 Arc,所有的 task_id 都存储在 scc::HashMap 中。但是在查询或更新任务状态时,必须对其进行克隆。

然而,如果您使用 Arc,只有 Arc 存储在 scc::HashMap 中,而 task_id 独立存储在堆上,这可能会造成额外的内存开销。

请自己决定是否使用 Arc

依赖

~3–4MB
~65K SLoC