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));
}
This slide should take about 6 minutes.

نکات کلیدی:

  • توجه داشته باشید که این یک مثال ساده برای نشان دادن syntax است. هیچ عملیات طولانی مدت یا هیچ هم‌زمانی(concurrency) واقعی در آن وجود ندارد!

  • نوع برگشت async call چیست؟

    • برای مشاهده type از let future: () = async_main(10); در main استفاده کنید.
  • کلمه کلیدی "async" شیرینیِ syntax زبان Rust است. کامپایلر نوع بازگشتی را با یک future جایگزین می‌کند.

  • شما نمی‌توانید بدون دستورالعمل‌های اضافی به کامپایلر در مورد نحوه استفاده از future بازگشتی، main را async کنید.

  • برای اجرای کدهای همگام به یک اجرا‌ کننده (executor) نیاز دارید.block_on که thread رشته فعلی را تا زمانی که future ارائه شده تکمیل شود مسدود می‌کند.

  • همیشه await به طور ناهمزمان (asyn) منتظر تکمیل یک عملیات دیگر است. برخلاف block_on یک await معمولاً thread فعلی را مسدود نمی‌کند.

  • .await فقط می‌تواند در داخل یک تابع async استفاده شود (یا block؛ این مورد در آینده معرفی می‌شوند).