async fn
- Rust kursu
- İleri seviye
- Ders 1/81
- 4 dk
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
use std::future::Future;
use std::pin::pin;
use std::task::{Context, Poll, Waker};
fn main() {
// buraya yaz
}Örnek çözüm
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
____ fn selam(ad: &str) -> String {
format!("Merhaba {ad}")
}
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 |