async
/await
從高層次的角度來看,非同步的 Rust 程式碼看起來很像「一般的」同步程式碼:
use futures::executor::block_on; async fn count_to(count: i32) { for i in 1..=count { println!("Count is: {i}!"); } } async fn async_main(count: i32) { count_to(count).await; } fn main() { block_on(async_main(10)); }
重要須知:
-
注意這只是一個簡化過的程式碼,目的是要示範程式語法。這份範例程式碼當中並沒有需要長時間運行的操作,也沒有真正的併行處理!
-
如何得知非同步函數的回傳型別?
- 在
main
函數中使用let feature: () = async_main(10);
以查看型態。
- 在
-
The "async" keyword is syntactic sugar. The compiler replaces the return type with a future.
-
你不能把
main
函數標示成非同步函數,除非你對編譯器額外設定了如何處理回傳的 future 的方式。 -
You need an executor to run async code.
block_on
blocks the current thread until the provided future has run to completion. -
.await
會非同步地等待其他操作執行完畢。別於block_on
,.await
不會阻塞當前的執行緒。 -
.await
can only be used inside anasync
function (or block; these are introduced later).