Futures

Future یک trait است، اجرا شده توسط objectهایی که نشان دهنده عملیاتی هستند که ممکن است هنوز کامل نشده باشد. می‌توان یک future را poll کرد و poll یک Poll را برمی‌گرداند.

#![allow(unused)]
fn main() {
use std::pin::Pin;
use std::task::Context;

pub trait Future {
    type Output;
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

pub enum Poll<T> {
    Ready(T),
    Pending,
}
}

یک تابع async یک impl Future را برمی‌گرداند. همچنین امکان (اما غیرمعمول) پیاده‌سازی Future برای تایپ‌های خودتان نیز وجود دارد. برای مثال، JoinHandle برگردانده شده از tokio::spawn Future را پیاده‌سازی می‌کند تا امکان پیوستن (joining) به آن را فراهم کند.

کلمه کلیدی .await که برای Future اعمال می‌شود، باعث می‌شود که تابع async فعلی تا زمانی که Future آماده شود متوقف شود و سپس خروجی آن ارزیابی شود.

This slide should take about 4 minutes.
  • تایپ‌های Future و Poll دقیقاً همانطور که نشان داده شده است اجرا می شوند. برای نمایش پیاده‌سازی‌ها در اسناد، روی لینک‌ها کلیک کنید.

  • ما به Pin و Context نخواهیم رسید، زیرا به جای ساختن کدهای اولیه async، بر نوشتن کدهای async تمرکز خواهیم کرد. به طور خلاصه:

    • Context به Future اجازه می‌دهد تا زمانی که رویدادی رخ می دهد، خود را برای poll مجدد برنامه‌ریزی کند.

    • Pin تضمین می‌کند که Future در حافظه جابه‌جا نمی‌شود، بنابراین pointerهای future معتبر باقی می‌مانند. این برای اجازه دادن به referenceها برای معتبر ماندن پس از .await لازم است.