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 آماده شود متوقف شود و سپس خروجی آن ارزیابی شود.
-
تایپهای
Future
وPoll
دقیقاً همانطور که نشان داده شده است اجرا می شوند. برای نمایش پیادهسازیها در اسناد، روی لینکها کلیک کنید. -
ما به
Pin
وContext
نخواهیم رسید، زیرا به جای ساختن کدهای اولیه async، بر نوشتن کدهای async تمرکز خواهیم کرد. به طور خلاصه:-
Context
به Future اجازه میدهد تا زمانی که رویدادی رخ می دهد، خود را برای poll مجدد برنامهریزی کند. -
Pin
تضمین میکند که Future در حافظه جابهجا نمیشود، بنابراین pointerهای future معتبر باقی میمانند. این برای اجازه دادن به referenceها برای معتبر ماندن پس از.await
لازم است.
-