2个版本

0.2.5 2023年12月2日
0.2.4 2023年12月2日

#1537 in 数据结构

GPL-3.0-or-later

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