#task-manager #tokio-task #group #nested #opinionated #generic #outcome

task-motel

具有嵌套任务组和可停止任务的偏执(Tokio)任务管理器

5个版本

0.1.0 2023年10月4日
0.1.0-rc.32023年1月20日
0.1.0-rc.12023年1月17日
0.1.0-rc.02023年1月13日

#2 in #outcome

Download history 490/week @ 2024-03-15 430/week @ 2024-03-22 300/week @ 2024-03-29 723/week @ 2024-04-05 586/week @ 2024-04-12 573/week @ 2024-04-19 786/week @ 2024-04-26 494/week @ 2024-05-03 455/week @ 2024-05-10 683/week @ 2024-05-17 629/week @ 2024-05-24 875/week @ 2024-05-31 528/week @ 2024-06-07 603/week @ 2024-06-14 583/week @ 2024-06-21 309/week @ 2024-06-28

2,201每月下载量
7个crate中使用(通过holochain

Apache-2.0

24KB
519

task-motel

一个有偏见的Tokio*任务管理器,具有任意嵌套的任务分组。

任务管理器接受两个泛型参数

pub struct TaskManager<GroupKey, Outcome>
where
    GroupKey: Clone + Eq + Hash + Send + std::fmt::Debug + 'static,
    Outcome: Send + 'static,

每个不同的GroupKey(由Eq定义)对应一个不同的组,因此使用相同GroupKey注册的任务属于同一组。使用enum作为您的GroupKey是有用的。

Outcome是所有任务必须返回的类型,可以是任何您想要的。

task-motel构建时几乎完全与执行器无关,但最终我需要能够启动一个任务,该任务将运行到完成而无需轮询,而这在依赖某个执行器的情况下是无法实现的。如果这可以解决,那么可以移除Tokio依赖。

处理任务结果

在构建一个TaskManager时,您将获得一个通道接收器,该接收器接收每个已完成的任务的(GroupKey, Outcome)。根据任务的结果,您可以通过终止应用程序、记录错误、启动新任务等方式进行响应。

分组任务

在注册任务时,您将其分配到一组。该组中的任务可以与其他组的任务单独管理:可以指示整个组停止,并等待关闭。

嵌套组

组可以任意嵌套,因此关闭父组也将递归地关闭所有子组。嵌套结构由TaskManager::new构造函数的Fn(GroupKey) -> Option<GroupKey>函数参数确定,该参数接受一个GroupKey并生成一个Option<GroupKey>,声明组的父级,定义树结构。

停止任务

在注册任务时,必须使用一个闭包来注入一个StopListener。这个StopListener是一个简单的future,当任务管理器收到关闭信号时会解析,因此应该相应地将其集成到任务中,以允许任务从外部输入关闭。

只有当任务完成后,才应该丢弃StopListener,因为任务管理器使用流通中的StopListener的数量来确定正在积极管理的任务数量。

依赖项

~3.5–9.5MB
~77K SLoC