CodeBlanks Logo Icon CodeBlanks

async fn

async fn ile asenkron fonksiyon tanımlamayı öğrenirsin.

async fn

async fn çağrıldığında gövdesi çalışmaz; bunun yerine bir Future döndürür. Future, "ileride bir değer üretecek hesaplama"dır ve bir yürütücü (executor) onu ilerletene kadar bekler:

async fn selam(ad: &str) -> String {
    format!("Merhaba {ad}")
}

let f = selam("Ece");   // henüz hiçbir şey çalışmadı
// f: impl Future<Output = String>

Rust'ın standart kütüphanesi bir yürütücü içermez; gerçek projelerde tokio gibi bir runtime kullanılır. Alıştırmalarda Future'ı tamamlanana kadar yoklayan (poll) küçük bir block_on yazacağız.

En küçük yürütücü

Bir yürütücünün çekirdeği, Future'ı Poll::Ready dönene kadar poll etmektir. Bekleyen bir iş yokken uyandırma bildirimi gerekmez, bu yüzden boş bir Waker yeterlidir:

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;
        }
    }
}

Gerçek runtime'lar meşgul döngü yerine, Future hazır olduğunu Waker ile bildirene kadar iş parçacığını uyutur.

Uygulama İlk async fonksiyon

Yukarıdaki block_on yürütücüsünü ve async fn selam(ad: &str) -> String fonksiyonunu yaz. block_on(selam("Ece")) sonucunu yazdır.

Başlangıç kodu

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

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 selam(ad: &str) -> String {
    format!("Merhaba {ad}")
}

fn main() {
    println!("{}", block_on(selam("Ece")));
}

Beklenen çıktı

Merhaba Ece

Soru ve cevaplar

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

1 <code>selam("Ece");</code> satırı tek başına yazılırsa ne olur?

  • Program bekler
  • Future oluşturulur ama hiç çalışmaz; derleyici "unused future" uyarısı verir Doğru cevap
  • Metin yazdırılır
  • Derleme hatası

Açıklama: Future'lar tembeldir; await edilmeden ya da bir yürütücüye verilmeden hiçbir iş yapmazlar.

2 Asenkron fonksiyon

Soru
____ fn selam(ad: &str) -> String {
    format!("Merhaba {ad}")
}
Cevap
async fn selam(ad: &str) -> String {
    format!("Merhaba {ad}")
}

Açıklama: async fn çağrıldığında bir Future döndürür.

3 Kavram ve anlamı

Kavram Anlamı
async fn Future döndürür
Future İleride gelecek değer
poll Bir adım ilerlet
executor Future'ları yürütür

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