CodeBlanks Logo Icon CodeBlanks

Tokio runtime

#[tokio::main] ile runtime başlatmayı öğrenirsin.

Tokio runtime

tokio, Rust'ın en yaygın asenkron runtime'ıdır: iş parçacığı havuzu, görev zamanlayıcı, zamanlayıcılar ve asenkron ağ/dosya API'leri sunar. #[tokio::main] özniteliği main'i async yapar:

// Cargo.toml: tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() {
    let veri = indir("https://..").await;
}

// açılımı kabaca:
fn main() {
    tokio::runtime::Runtime::new().unwrap().block_on(async {
        let veri = indir("https://..").await;
    })
}

Yani makro, önceki grupta yazdığımız block_on'un çok daha gelişmiş bir sürümünü çağırır.

Runtime türleri

Tokio iki zamanlayıcı sunar: çok iş parçacıklı (varsayılan, görevler CPU çekirdeklerine dağıtılır) ve tek iş parçacıklı (current_thread, testler ve küçük araçlar için):

#[tokio::main(flavor = "current_thread")]
async fn main() { .. }

#[tokio::test]
async fn async_test() {
    assert_eq!(hesapla().await, 42);
}

#[tokio::test], her test için ayrı bir runtime kurar.

Uygulama Makronun açılımı

#[tokio::main]'in açılımını taklit et: block_on yürütücüsünü yaz, async fn baslat() -> &'static str "sunucu başladı" döndürsün. main'de block_on(async { baslat().await }) 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 baslat() -> &'static str {
    "sunucu başladı"
}

fn main() {
    let mesaj = block_on(async { baslat().await });
    println!("{}", mesaj);
}

Beklenen çıktı

sunucu başladı

Soru ve cevaplar

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

1 Async bir görevde <code>std::thread::sleep</code> çağırmak neden sorunludur?

  • Sorun yoktur
  • Runtime'ın iş parçacığını bloke eder; aynı thread'deki diğer görevler de bekler Doğru cevap
  • Derlenmez
  • Daha uzun uyur

Açıklama: Async kodda tokio::time::sleep(..).await kullanılır; bloke eden işler için tokio::task::spawn_blocking vardır.

2 Runtime girişi

Soru
#[tokio::____]
async fn main() {
    println!("başladı");
}
Cevap
#[tokio::main]
async fn main() {
    println!("başladı");
}

Açıklama: #[tokio::main] async main'i bir runtime içinde çalıştırır.

3 Araç ve görevi

Kavram Anlamı
#[tokio::main] Async main
#[tokio::test] Async test
current_thread Tek iş parçacığı
spawn_blocking Bloke eden iş

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