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 异步
16KB
214 行
简介
用于记录异步方法中异步任务执行状态的struct。
函数
- 能够托管
Future
,并查询它们是否为未找到、正在运行、成功、失败或撤销。 - 能够托管
Future
来撤销成功的Future
并使其变为未找到。
依赖
- 依赖于
tokio
的rt
特性,因此不能使用其他异步运行时。 - 依赖于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
- 只能在
NotFound
或Failed
时启动。 - 只能在
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