繁体   English   中英

Rust:异步不并发

[英]Rust: async is not concurent

这是 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中的所有异步函数都是同步执行的。

output 是

learn_song sing_song dance learn_song sing_song

如果它们异步运行,我希望在我的 output 中得到类似的东西

learn_song dance learn_song sing_song sing_song

如果我添加一个额外的learn_and_sing调用,它将像同步 function 一样打印钢。

问题为什么会这样? 是否可以只使用async/.await而没有线程来实现真正的异步?

与 tkausl 的注释状态一样,std::thread::sleep 使整个线程休眠,从而防止线程上的任何代码在休眠期间执行。 在这种情况下,您可以使用async_std::task::sleep ,因为它是睡眠 function 的异步版本。

 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) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM