這是 Rust 書中的示例。
async fn learn_and_sing() {
// Wait until the song has been learned before singing it.
// We use `.await` here rather than `block_on` to prevent blocking the
// thread, which makes it possible to `dance` at the same time.
let song = learn_song().await;
sing_song(song).await;
}
async fn async_main() {
let f1 = learn_and_sing();
let f2 = dance();
// `join!` is like `.await` but can wait for multiple futures concurrently.
// If we're temporarily blocked in the `learn_and_sing` future, the `dance`
// future will take over the current thread. If `dance` becomes blocked,
// `learn_and_sing` can take back over. If both futures are blocked, then
// `async_main` is blocked and will yield to the executor.
futures::join!(f1, f2);
}
fn main() {
block_on(async_main());
}
它說
在這個例子中,學習歌曲必須在唱歌之前發生,但是學習和唱歌可以與跳舞同時發生。
但我無法理解這一點。我用 Rust 寫了一個簡短的代碼
async fn learn_song() -> &'static str {
println!("learn_song");
"some song"
}
#[allow(unused_variables)]
async fn sing_song(song: &str) {
println!("sing_song");
}
async fn dance() {
println!("dance");
}
async fn learn_and_sing() {
let song = learn_song().await;
std::thread::sleep(std::time::Duration::from_secs(1));
sing_song(song).await;
}
async fn async_main() {
let f1 = learn_and_sing();
let f2 = dance();
let f3 = learn_and_sing();
futures::join!(f1, f2, f3);
}
fn main() {
futures::executor::block_on(async_main());
}
似乎所有異步函式都是async_main同步執行的。
輸出是
learn_song
sing_song
dance
learn_song
sing_song
如果它們異步運行,我希望在我的輸出中得到類似的東西
learn_song
dance
learn_song
sing_song
sing_song
如果我添加一個額外的呼叫learn_and_sing它會像在同步函式中一樣列印鋼。
問題為什么會這樣?async/.await是否可以只使用執行緒而不使用執行緒來實作真正的異步?
uj5u.com熱心網友回復:
與 tkausl 的注釋狀態一樣,std::thread::sleep 使整個執行緒休眠,從而防止執行緒上的任何代碼在休眠期間執行。在這種情況下,您可以使用async_std::task::sleep,因為它是 sleep 函式的異步版本。
async fn learn_song() -> &'static str {
println!("learn_song");
"some song"
}
#[allow(unused_variables)]
async fn sing_song(song: &str) {
println!("sing_song");
}
async fn dance() {
println!("dance");
}
async fn learn_and_sing() {
let song = learn_song().await;
async_std::task::sleep(std::time::Duration::from_secs(1)).await;
sing_song(song).await;
}
#[async_std::main]
async fn main() {
let f1 = learn_and_sing();
let f2 = dance();
let f3 = learn_and_sing();
futures::join!(f1, f2, f3);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498330.html
上一篇:使用Apache的ProxyPassMatch,我如何只傳遞我的URL的一部分?
下一篇:在chrome擴展的后臺腳本中,如何處理對chrome.runtime.onInstalled事件的addListener()方法的呼叫?
