tokio::fs
- Rust kursu
- İleri seviye
- Ders 10/81
- 4 dk
tokio::fs ile asenkron dosya I/O yapmayı öğrenirsin.
tokio::fs
tokio::fs, std::fs ile aynı adlara sahip asenkron fonksiyonlar sunar. Arka planda işlemleri ayrı bir iş parçacığı havuzunda yürütür, böylece görev zamanlayıcı bloke olmaz:
use tokio::fs;
fs::write("selam.txt", "merhaba").await?;
let icerik = fs::read_to_string("selam.txt").await?;
println!("{} bayt", icerik.len());Çok sayıda küçük dosya işlemi için std'yi spawn_blocking içinde toplu çağırmak çoğu zaman daha hızlıdır.
std ile aynı işlem
Alıştırmada aynı adımları std ile yapıyoruz; API'lerin birebir aynı olması, kodu async'e geçirmeyi kolaylaştırır:
use std::{env, fs, io};
fn main() -> io::Result<()> {
let yol = env::temp_dir().join("selam.txt");
fs::write(&yol, "merhaba")?;
let icerik = fs::read_to_string(&yol)?;
println!("{} bayt", icerik.len());
Ok(())
}Uygulama Yaz ve oku
main io::Result<()> döndürsün. Geçici klasörde selam.txt dosyasına "merhaba" yaz, geri oku ve N bayt yazdır.
Başlangıç kodu
use std::{env, fs, io};
fn main() {
// buraya yaz
}Örnek çözüm
use std::{env, fs, io};
fn main() -> io::Result<()> {
let yol = env::temp_dir().join("selam.txt");
fs::write(&yol, "merhaba")?;
let icerik = fs::read_to_string(&yol)?;
println!("{} bayt", icerik.len());
Ok(())
}Beklenen çıktı
7 bayt
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Neden işletim sistemi dosya G/Ç'si için gerçek asenkron arayüz sunmaz (çoğu platformda)?
- Rust desteklemez
- Gerek yoktur
- Klasik dosya çağrıları bloke edicidir; tokio bunları thread havuzunda çalıştırır Doğru cevap
- Dosyalar çok küçüktür
Açıklama: Ağ soketleri epoll/kqueue ile gerçekten bloke olmadan beklenir; dosyalar için io_uring gibi yeni arayüzler vardır.
2 Asenkron okuma
let icerik = tokio::fs::read_to_string("selam.txt").____?;
let icerik = tokio::fs::read_to_string("selam.txt").await?;
Açıklama: tokio::fs fonksiyonları Future döndürür; .await ile beklenir.
3 std ve tokio karşılığı
| Kavram | Anlamı |
|---|---|
std::fs::write |
tokio::fs::write(..).await |
std::thread::sleep |
tokio::time::sleep(..).await |
std::net::TcpListener |
tokio::net::TcpListener |
thread::spawn |
tokio::spawn |