spawn
- Rust kursu
- İleri seviye
- Ders 8/81
- 4 dk
tokio::spawn ile asenkron görev oluşturursun.
spawn
tokio::spawn, bir Future'ı bağımsız bir görev olarak runtime'a verir ve bir JoinHandle döndürür. Görevler çok hafiftir; binlercesi aynı anda yaşayabilir:
let tutucular: Vec<_> = (1..=3)
.map(|i| tokio::spawn(async move { i * i }))
.collect();
for t in tutucular {
println!("{}", t.await.unwrap());
}Görev runtime'ın herhangi bir iş parçacığında çalışabileceği için Future Send + 'static olmalıdır; yani dışarıdan ödünç değil, sahiplenilmiş veri (async move) kullanmalıdır.
std karşılığı
Aynı desen işletim sistemi thread'leriyle std::thread::spawn ile kurulur. Thread'ler görevlerden çok daha ağırdır (her biri ayrı bir stack), ama CPU yoğun işler için doğru araçtır:
use std::thread;
let tutucular: Vec<_> = (1..=3)
.map(|i| thread::spawn(move || i * i))
.collect();
let sonuc: Vec<i32> = tutucular.into_iter().map(|t| t.join().unwrap()).collect();Sonuçları handle sırasıyla toplamak, çıktının hangi thread'in önce bittiğine bağlı olmamasını sağlar.
Uygulama Paralel kareler
1..=3 için her biri i * i hesaplayan üç thread::spawn başlat. Sonuçları join ile handle sırasına göre bir vektöre topla ve yazdır.
Başlangıç kodu
use std::thread;
fn main() {
// buraya yaz
}Örnek çözüm
use std::thread;
fn main() {
let tutucular: Vec<_> = (1..=3).map(|i| thread::spawn(move || i * i)).collect();
let sonuc: Vec<i32> = tutucular.into_iter().map(|t| t.join().unwrap()).collect();
println!("{:?}", sonuc);
}Beklenen çıktı
[1, 4, 9]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>JoinHandle</code>'ı await etmeden bırakırsan görev ne olur?
- Arka planda çalışmaya devam eder (ayrılır) Doğru cevap
- Hemen iptal edilir
- Panic
- Hiç başlamaz
Açıklama: İptal için handle.abort() çağrılır. Std thread'lerinde de JoinHandle'ı bırakmak thread'i ayırır.
2 Görev başlat
let t = tokio::____(async move { 2 + 2 });
println!("{}", t.await.unwrap());
let t = tokio::spawn(async move { 2 + 2 });
println!("{}", t.await.unwrap());
Açıklama: tokio::spawn Future'ı bağımsız bir görev olarak çalıştırır.
3 Araç ve özelliği
| Kavram | Anlamı |
|---|---|
tokio::spawn |
Hafif görev |
thread::spawn |
OS thread'i |
handle.await |
Görev sonucu |
handle.abort() |
Görevi iptal |