CodeBlanks Logo Icon CodeBlanks

spawn

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

main.rs
use std::thread;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
let t = tokio::____(async move { 2 + 2 });
println!("{}", t.await.unwrap());
Cevap
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

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