Rust
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.
Örnek çözümü göster
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);
}
Kendini test et
-
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
- Derlenmez
- Daha uzun uyur
Cevabı göster
Runtime'ın iş parçacığını bloke eder; aynı thread'deki diğer görevler de bekler — Async kodda tokio::time::sleep(..).await kullanılır; bloke eden işler için tokio::task::spawn_blocking vardır.
-
Runtime girişi
#[tokio::____]
async fn main() {
println!("başladı");
}
Cevabı göster
#[tokio::main]
async fn main() {
println!("başladı");
}
-
Araç ve görevi
- #[tokio::main]
- Async main
- #[tokio::test]
- Async test
- current_thread
- Tek iş parçacığı
- spawn_blocking
- Bloke eden iş
Sıradaki ders: spawn