我实现了一个在Rust中异步处理某种任务的系统。为了做到这一点,我使用的是futures
crate(0.2 beta版)。处理这些任务之一需要临时但独占使用某种类型的资源,其中系统中有固定数量的资源。
请记住,这一切都发生在并发上下文中:多个线程可能正在尝试一次处理任务。我正在使用的界面的简化版本是:
// A fixed number of these are held by the System, and a TaskFuture needs one to complete.
pub struct Resource { ... }
pub struct System { /* how should the system hold Resources? */ }
impl System {
pub fn queue_task(&self, data: TaskData) -> TaskFuture {
TaskFuture { system: self }
}
}
pub struct TaskFuture<'a> { system: &'a System, ... }
impl<'a> Future for TaskFuture<'a> {
type Item = ...;
type Error = ...;
fn poll(&mut self, cx: &mut Context) -> Result<Async<Self::Item>, Self::Error> {
/* how can I implement this? */
}
}
可以看出,我不太清楚实现这样一个系统的最佳方法是什么。
我的第一个想法是让System
持有多个Mutex<Resource>
,让TaskFuture::poll
尝试获得一个{}}如果可用,如果不能返回NotReady
(尽管我不确定在那种情况下我将如何唤醒未来。)无论如何,我觉得除非绝对必要,否则我应该避免在基于std
的上下文中使用futures
同步原语,因此是否存在更基于惯用futures
的解决方案这个?