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