【发布时间】:2017-06-08 05:15:06
【问题描述】:
我正在尝试使用 Future.rs 在单独的进程中管理一些任务。我看到了如何等待每个创建的未来以及如何一个接一个地处理它们,但我无法在其执行期间轮询未来以了解其状态。我总是有错误:
线程“主”因“当前没有任务正在运行”而恐慌
我想在以后的处理过程中做一些事情,直到它完成。也许我没有以正确的方式使用它?我设法通过使用通道使其工作,但我认为应该可以对未来进行轮询,并在它准备好时得到结果。 我用来测试的代码是:
fn main() {
println!("test future");
let thread_pool = CpuPool::new(4);
let mut future_execution_list = vec![];
let mutex = Arc::new(AtomicUsize::new(0));
//create the future to process
for _ in 0..10 {
let send_mutex = mutex.clone();
let future = thread_pool.spawn_fn(move || {
//Simulate long processing
thread::sleep(time::Duration::from_millis(10));
let num = send_mutex.load(Ordering::Relaxed);
send_mutex.store(num + 1, Ordering::Relaxed);
let res: Result<usize, ()> = Ok(num);
res
});
future_execution_list.push(future);
}
// do the job
loop {
for future in &mut future_execution_list {
match future.poll() {
Ok(Async::NotReady) => (), //do nothing
Ok(Async::Ready(num)) => {
//update task status
println!(" future {:?}", num);
}
Err(_) => {
//log error and set task status to err
()
}
};
}
//do something else
}
}
所以我在 Shepmaster 回答后完成了我的问题。您的评论很有趣,但我仍然找不到解决问题的方法。我将添加一些有关我的问题的信息。我想在一次可以管理多个任务的自动化设备上安排任务。有一个循环,其中管理事件并计算任务调度。当一个任务被安排时,它就会产生。当一个任务结束时,一个新的调度就完成了。在任务执行期间,管理事件。伪代码可以是:
loop {
event.try_recv() { ...} //manage user command for exemple
if (schedule) {
let tasks_to_spawn = schedule_task();
let futures = tasks_to_spawn.map(|task| {
thread_pool.spawn_fn( ....)});
let mut one = future::select_all(futures);
while let Ok((value, _idx, remaining)) = one.wait() {..} //wait here
}
//depend on task end state and event set schedule to true or false.
}
我可以在未来联合调度和任务,例如:
let future = schedule.and_them(|task| execute_task);
但是我仍然需要等待第一个任务的执行结束。 我可以把一切都放在未来(事件管理、日程安排、任务),然后像你建议的那样等待第一个结束。我尝试过,但我没有看到如何使用不同的 Item 和 Error 类型来制作未来的 vec。有了这个概念,我必须在线程之间管理更多数据。事件管理和调度不必在不同的线程中执行。
我看到另一个问题,select_all 取得了 vec 的所有权。如果在执行另一个任务期间必须取消一个新任务,我该如何更改 vec 并添加新的未来?
不知道你是否有一个简单的解决方案。我在想,在执行过程中使用 isDone() 之类的方法获取未来状态很简单,无需等待。也许这是计划好的,我没有看到关于此的 PR。 如果您有一个简单的解决方案,那就太好了,否则我会重新考虑我的概念。
【问题讨论】:
-
您有 99.9% 的可能性不希望以这种方式使用原子变量。相反,您想要
fetch_add而绝大多数人不想要Relaxed订购。 -
你说得对,我只是复制/粘贴一些代码来表明我想从未来的执行中获得一个结果,该结果取决于其他期货的执行。
-
所以我无法更改我的问题(我明白为什么),我无法回复答案。我的回复被删除了。那么我怎样才能对最初的问题添加更深入的解释,特别是当他们参考答案时,使用评论?我真的不习惯stackaverflow的处理方式。通常,处理流程允许跟随演变。下次遇到复杂问题时,我会使用 Reddit 或其他论坛。感谢您的评论以及您对改进我对 stackoverflow 的使用的帮助。
-
您绝对可以回复答案。这就是每个答案下方的 cmets 的用途(就像这个问题下方的 cmets 一样)。 Stack Overflow 是一个问答网站。这不适合每个人的风格,没关系。 /r/rust、the user's forum 或 IRC 是讨论 Rust 代码的好地方。
标签: asynchronous rust future