我正在嘗試使用Future.rs來管理一個單獨的過程中的一些任務。我看到了如何等待每個創建的未來以及如何一個接一個地處理它們,但我無法在執行過程中調查未來以瞭解其狀態。我總是有錯誤:如何在未等待的情況下輪詢未來狀態?
thread 'main' panicked at 'no Task is currently running'
我想在將來的處理過程中做某件事,直到它完成。也許我沒有正確地使用它?我設法通過使用頻道使其工作,但我認爲應該有可能輪詢未來,以及何時可以得到結果。 我用它來測試它的代碼是:
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答案後,我的問題。您的評論非常有趣,但我仍無法找到解決我的問題的方案。我會添加一些關於我的問題的信息。我想在自動化計劃任務上同時管理多個任務。有一個循環,其中管理事件並計算任務計劃。當一個任務被安排時,它就產生了。當任務結束時,新的調度完成。在任務執行期間,管理事件。一個speudo代碼可以是:
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()等方法在執行過程中未來的狀態很容易,而不用等待。也許是有計劃的,我沒有看到有關這方面的公關。 如果你有一個簡單的解決方案,它會很好,否則我會重新思考我的概念。
有一個99.9%的機會,你做**不**要以這種方式使用原子變量。相反,你希望'fetch_add'和絕大多數人不需要'Relaxed'排序。 – Shepmaster
您的權利,我只是複製/粘貼一些代碼,以表明我想從未來的執行中得到一個結果,這取決於其他期貨的執行情況。 –
這是[*非常糟糕的形式*在您收到答案後更改您的問題**,特別是當更改使這些答案無效時](http://meta.stackoverflow.com/q/309237/155423)。從一開始就提出一個包含任何相關細節的好問題是提問者的問題。 – Shepmaster