Tokio runtime
- Rust kursu
- İleri seviye
- Ders 7/81
- 4 dk
#[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
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 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
#[tokio::____]
async fn main() {
println!("başladı");
}
#[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ş |