考慮下面的代碼爲什麼`Future :: poll`在返回`NotReady`後沒有重複調用?
extern crate futures;
use std::sync::{atomic, Arc};
use futures::*;
struct F(Arc<atomic::AtomicBool>);
impl Future for F {
type Item =();
type Error =();
fn poll(&mut self) -> Result<Async<Self::Item>, Self::Error> {
println!("Check if flag is set");
if self.0.load(atomic::Ordering::Relaxed) {
Ok(Async::Ready(()))
} else {
Ok(Async::NotReady)
}
}
}
fn main() {
let flag = Arc::new(atomic::AtomicBool::new(false));
let future = F(flag.clone());
::std::thread::spawn(move || {
::std::thread::sleep_ms(10);
println!("set flag");
flag.store(true, atomic::Ordering::Relaxed);
});
// ::std::thread::sleep_ms(20);
let result = future.wait();
println!("result: {:?}", result);
}
的產生的線程設置一個標誌,這對於未來的等待。 我們還會睡眠產生的線程,因此.wait()
的初始.poll()
調用在標誌設置之前。這會導致.wait()
無限期地(看起來)阻塞。如果我們取消註釋thread::sleep_ms
,.wait()
返回,並打印出結果(()
)。
我期望當前線程多次調用poll
來嘗試解決未來問題,因爲我們阻止當前線程。但是,這沒有發生。
我曾嘗試閱讀some docs,而且好像問題是,線程是從poll
在第一時間得到NotReady
後park
版。但是,我不清楚爲什麼這是,或者如何解決這個問題。
我錯過了什麼?
*答案相當明顯,恕我直言* - 如果答案顯而易見,人們不需要問這個問題^ _^ – Shepmaster
@Shepmaster這是一個有效的jibe,但人們也會問一些問題來確認一些事情或發泄他們的挫折等等。 =) 通過說明答案很明顯,我表示此事很簡單,不需要過時。此外,「小學,我親愛的沃森」:) – ArtemGr
好吧!我瞭解停車計劃背後的動機,但我並沒有意識到我必須手動處理公園材料(儘管這很有意義 - 「期貨」如何知道價值何時準備好?)。謝謝! – MartinHaTh