2个版本
0.2.5 | 2023年12月2日 |
---|---|
0.2.4 | 2023年12月2日 |
#1537 in 数据结构
17KB
249 行
workit
rust的单线程工作队列工具
workit
是一种简单的方式,可以在Rust项目中排队一个任务稍后执行。它适用于不希望实现异步运行时(如tokio)的项目,可能适合处理可能表现出爆发行为的流数据的项目。
概念
基本接口针对单线程项目:您将闭包排队,workit
可以拥有其所有权(在实践中,您通常使用Arc<Mutex<T>>
与它一起使用),然后每隔一段时间,当您的进程可以节省一些周期时,您调用do_work()
并传递一个时间量。workit
将执行任务,检查时间是否已过去,如果没有,则执行另一个,等等。
具体来说,传递的函数必须是FnMut() + Send
,并仅返回一个布尔值,指示任务是否成功或失败。
您可以自定义任务应该尝试的次数(最多),以及当任务失败时,在重试相同任务之间等待多长时间。
workit
完全线程安全,在后台使用单个全局队列运行,实际上可以在任何上下文中使用(但如果您打算生成多个线程来处理工作并且愿意使用异步运行时,您可能最好使用现代的工作窃取队列库等)。
用法
workit::enqueue(|| {
// one-shot task
true
}, 1, None);
workit::enqueue(|| {
// retryable task
true
}, 5, Some(Duration::from_secs(1)));
// Work for 5 seconds, or until all queued work is either done or in cooldown
let status = workit::do_work(Duration::from_secs(5));
// Optionally, inspect status and act on it somehow
match status {
QueueStatus::Empty => {},
QueueStatus::WorkPending(len) => {
// do something
}
QueueStatus::InCooldown(len) => {
// do something else
}
}
示例
请参阅src/lib.rs
中的测试,以获取一些额外的抽象用法示例。
依赖项
~48KB