CodeBlanks Logo Icon CodeBlanks

Özet - async/await

async fn, await ve block'u birleştirerek iki görevi sırayla beklersin.

async/await özeti

async fn ve async { } tembel Future'lar üretir; .await sonucu bekler ve bir duraklama noktasıdır. Future trait'i tek bir poll metodundan oluşur: Ready(v) ya da Pending. Pending dönen Future, hazır olduğunda Waker ile yürütücüyü uyandırır. Pin kendine referans tutan durum makinelerinin taşınmamasını garanti eder. Standart kütüphane yürütücü içermez; gerçek projelerde tokio kullanılır.

Döngüde await

Async fonksiyonlar normal kontrol akışını kullanır; döngüler, koşullar ve ? aynı şekilde çalışır:

async fn adim(n: u32) -> u32 {
    n * n
}

async fn hepsi() -> Vec<u32> {
    let mut v = Vec::new();
    for i in 1..=3 {
        v.push(adim(i).await);
    }
    v
}

Uygulama Döngüde bekle

Yukarıdaki adim ve hepsi async fonksiyonlarını yaz. block_on(hepsi()) sonucunu {:?} ile yazdır.

Başlangıç kodu

main.rs
use std::future::Future;
use std::pin::pin;
use std::task::{Context, Poll, Waker};

fn block_on<F: Future>(f: F) -> F::Output {
    let mut f = pin!(f);
    let mut cx = Context::from_waker(Waker::noop());
    loop {
        if let Poll::Ready(v) = f.as_mut().poll(&mut cx) {
            return v;
        }
    }
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::future::Future;
use std::pin::pin;
use std::task::{Context, Poll, Waker};

fn block_on<F: Future>(f: F) -> F::Output {
    let mut f = pin!(f);
    let mut cx = Context::from_waker(Waker::noop());
    loop {
        if let Poll::Ready(v) = f.as_mut().poll(&mut cx) {
            return v;
        }
    }
}

async fn adim(n: u32) -> u32 {
    n * n
}

async fn hepsi() -> Vec<u32> {
    let mut v = Vec::new();
    for i in 1..=3 {
        v.push(adim(i).await);
    }
    v
}

fn main() {
    println!("{:?}", block_on(hepsi()));
}

Beklenen çıktı

[1, 4, 9]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Async kod ne zaman thread'lerden daha uygundur?

  • Çok sayıda eşzamanlı ve çoğunlukla G/Ç bekleyen iş olduğunda Doğru cevap
  • Yoğun hesaplama işlerinde
  • Her zaman
  • Hiçbir zaman

Açıklama: On binlerce bağlantı az sayıda thread ile yönetilebilir; CPU yoğun işler için thread ya da rayon daha uygundur.

2 Hazır sonuç

Soru
if let Poll::____(v) = f.as_mut().poll(&mut cx) {
    return v;
}
Cevap
if let Poll::Ready(v) = f.as_mut().poll(&mut cx) {
    return v;
}

Açıklama: Poll::Ready sonucu taşır.

3 Grubun özeti

Kavram Anlamı
async fn Tembel Future
.await Duraklama noktası
Future::poll Bir adım
Pin Taşınmaz

İleri seviye bölümündeki tüm dersler