async/await
At a high level, async Rust code looks very much like “normal” sequential code:
use futures::executor::block_on;
async fn count_to(count: i32) {
for i in 0..count {
println!("Count is: {i}!");
}
}
async fn async_main(count: i32) {
count_to(count).await;
}
fn main() {
block_on(async_main(10));
}
نکات کلیدی:
-
توجه داشته باشید که این یک مثال ساده برای نشان دادن syntax است. هیچ عملیات طولانی مدت یا هیچ همزمانی(concurrency) واقعی در آن وجود ندارد!
-
نوع برگشت async call چیست؟
- برای مشاهده type از
let future: () = async_main(10);درmainاستفاده کنید.
- برای مشاهده type از
-
کلمه کلیدی “async” شیرینیِ syntax زبان Rust است. کامپایلر نوع بازگشتی را با یک future جایگزین میکند.
-
شما نمیتوانید بدون دستورالعملهای اضافی به کامپایلر در مورد نحوه استفاده از future بازگشتی،
mainرا async کنید. -
برای اجرای کدهای همگام به یک اجرا کننده (executor) نیاز دارید.
block_onکه thread رشته فعلی را تا زمانی که future ارائه شده تکمیل شود مسدود میکند. -
همیشه
awaitبه طور ناهمزمان (asyn) منتظر تکمیل یک عملیات دیگر است. برخلافblock_onیکawaitمعمولاً thread فعلی را مسدود نمیکند. -
.awaitفقط میتواند در داخل یک تابعasyncاستفاده شود (یا block؛ این مورد در آینده معرفی میشوند).