Özet - async/await
- Rust kursu
- İleri seviye
- Ders 6/81
- 5 dk
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
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
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ç
if let Poll::____(v) = f.as_mut().poll(&mut cx) {
return v;
}
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 |