Mengendalikan Future dan Tugasan
Fahami trait `Future` serta cara tugasan dijadualkan dan diurus dalam persekitaran masa jalan tak segerak.
Mengendalikan Future dan Tugasan ialah pelajaran Belajar Pengaturcaraan Rust percuma di CoddyKit. Ini ialah pelajaran 3 daripada 3. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Belajar Pengaturcaraan Rust, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 3 pelajaran.
Apakah Future Rust?
Dalam Rust tak segerak, Future ialah trait yang mewakili pengiraan tak segerak yang mungkin selesai pada suatu ketika. Anggaplah ia sebagai janji untuk nilai yang masih belum sedia.
- Ia ialah blok binaan teras untuk Rust async.
async fndalam Rust sebenarnya mengembalikan jenis tanpa nama yang melaksanakan traitFuture.- Nilai itu tidak dikira serta-merta; ia dikira apabila
Future"ditinjau" oleh pelaksana.
Cara Future Membuat Kemajuan
Future tidak berjalan dengan sendiri. Pelaksana seperti masa jalan Tokio berulang kali "meninjau"nya untuk memeriksa sama ada ia telah membuat kemajuan atau selesai.
- Apabila ditinjau,
Futuremengembalikan sama adaPoll::Pending(belum selesai) atauPoll::Ready(T)(selesai, inilah hasilnya). - Jika
Pending, pelaksana tahu untuk meninjaunya semula kemudian apabila sesuatu yang berkaitan berlaku (contohnya, I/O selesai). - Mekanisme tinjauan ini membolehkan banyak operasi tak segerak berjalan serentak pada satu bebenang.
Kod async Anda ialah Future
Apabila anda menulis async fn, Rust mengubahnya menjadi mesin keadaan yang melaksanakan trait Future. Pengiraan sebenar hanya bermula apabila Future yang dikembalikan ditinjau.
Mari lihat fungsi async yang ringkas. Ia tidak berjalan sehingga ditunggu oleh pelaksana.
async fn say_hello() -> String {
"Hello from a Future!".to_string()
}
#[tokio::main]
async fn main() {
let future = say_hello(); // This doesn't run the function yet!
println!("Future created, but not awaited.");
// To run it, an executor needs to poll it, often via .await
// let result = future.await;
// println!("{}", result);
}Future Menjadi Tugas
Walaupun Future ialah takrifan pengiraan async, tugas ialah contoh aktif Future itu yang digerakkan hingga selesai oleh pelaksana.
- Apabila anda mengarahkan pelaksana seperti Tokio untuk menjalankan
Future, ia membungkusnya dalam tugas. - Pelaksana kemudian mengurus tugas ini dan meninjaunya setiap kali ia sedia untuk membuat kemajuan.
- Tugas ialah unit kerja yang dijadualkan dan dilaksanakan secara serentak oleh masa jalan async.
Mencipta Tugas untuk Keserentakan
Untuk menjalankan Future secara serentak dengan kod lain, anda "menciptanya" pada masa jalan Tokio. Ini menghasilkan tugas baharu yang akan diurus oleh masa jalan.
Fungsi tokio::spawn menerima satu Future dan mengembalikan JoinHandle, yang boleh anda gunakan untuk menunggu tugas selesai dan mendapatkan hasilnya.
async fn perform_task(id: u8) -> String {
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
format!("Task {} finished!", id)
}
#[tokio::main]
async fn main() {
println!("Main started.");
let handle = tokio::spawn(async {
perform_task(1).await
});
println!("Task 1 spawned.");
// We will await 'handle' in the next scene to get the result.
// let result = handle.await.unwrap();
// println!("{}", result);
}Mendapatkan Hasil daripada Tugas
JoinHandle yang dikembalikan oleh tokio::spawn itu sendiri ialah Future. Anda boleh menggunakan .await pada pemegang ini untuk menunggu tugas yang dicipta selesai dan mendapatkan nilai pulangannya.
Jika tugas yang dicipta mengalami panik, menunggu JoinHandlenya akan mengembalikan ralat.
async fn perform_task(id: u8) -> String {
tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
format!("Task {} finished!", id)
}
#[tokio::main]
async fn main() {
println!("Main started.");
let handle = tokio::spawn(async {
perform_task(1).await
});
println!("Task 1 spawned.");
let result = handle.await.unwrap(); // Await the handle to get the result
println!("{}", result);
println!("Main finished.");
}Berbilang Tugas Serentak
Kuasa tugas dan tokio::spawn benar-benar terserlah apabila anda menjalankan berbilang operasi secara serentak. Masa jalan Tokio bertukar antara tugas dengan cekap apabila tugas tersebut sedia.
Ini membolehkan atur cara anda membuat kemajuan dalam banyak perkara serentak tanpa menyekat, walaupun pada satu bebenang.
async fn long_task(id: u8) -> String {
tokio::time::sleep(tokio::time::Duration::from_millis(100 + id as u64 * 50)).await;
format!("Long task {} done!", id)
}
#[tokio::main]
async fn main() {
println!("Main started.");
let handle1 = tokio::spawn(long_task(1));
let handle2 = tokio::spawn(long_task(2));
println!("Both tasks spawned.");
let result1 = handle1.await.unwrap();
let result2 = handle2.await.unwrap();
println!("{}\n{}", result1, result2);
println!("Main finished.");
}Menunggu Kesemuanya dengan join!
Apabila anda perlu menunggu beberapa Future selesai pada masa yang sama, tokio::join! ialah makro yang berguna. Ia menunggu semua future yang diberikan secara serentak dan mengembalikan hasilnya sebagai tuple.
Ia serupa dengan menunggu setiap pemegang secara berasingan, tetapi biasanya lebih ringkas untuk bilangan future yang tetap.
async fn fetch_data(source: &str) -> String {
tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
format!("Data from {}", source)
}
#[tokio::main]
async fn main() {
println!("Starting data fetches...");
let (data_a, data_b) = tokio::join!(
fetch_data("Server A"),
fetch_data("Database B")
);
println!("Fetched: {}\nFetched: {}", data_a, data_b);
println!("All fetches complete.");
}Mengendalikan Ralat Tugas
Operasi tak segerak boleh gagal, sama seperti operasi segerak. Lazimnya Future mengembalikan jenis Result, yang menunjukkan kejayaan atau kegagalan.
Apabila menunggu JoinHandle, ingat bahawa hasilnya dibungkus dalam Result lain kerana tugas itu sendiri mungkin mengalami panik. Anda sering akan melihat handle.await? (jika dalam async fn yang mengembalikan Result) atau handle.await.unwrap() / .expect().
async fn might_fail(should_fail: bool) -> Result<String, &'static str> {
tokio::time::sleep(tokio::time::Duration::from_millis(30)).await;
if should_fail {
Err("Oops, something went wrong!")
} else {
Ok("Operation successful!".to_string())
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let handle_ok = tokio::spawn(might_fail(false));
let handle_err = tokio::spawn(might_fail(true));
let result_ok = handle_ok.await??; // Await handle, then await inner Result
println!("{}", result_ok);
match handle_err.await? { // Await handle, then handle inner Result
Ok(val) => println!("{}", val),
Err(e) => eprintln!("Error: {}", e),
}
Ok(())
}Memahami Future & Tugas
Anda telah mempelajari Future sebagai pengiraan dan Tugas sebagai contoh pelaksanaannya. Pernyataan manakah tentang tokio::spawn dan JoinHandle yang benar?
Imbas Kembali: Future dan Tugas
Syabas! Kini anda telah memahami konsep teras Future dan tugas dalam ekosistem tak segerak Rust:
Futureialah trait yang mewakili pengiraan tak segerak yang akhirnya akan menghasilkan nilai.async fndikompil menjadi jenis yang melaksanakan traitFuture.- Tugas ialah contoh
Futureyang diurus dan ditinjau secara aktif oleh pelaksana seperti Tokio. tokio::spawndigunakan untuk mencipta tugas baharu dan mengembalikanJoinHandle.- Anda menggunakan
.awaitpadaJoinHandleuntuk mendapatkan hasil tugas yang dicipta.
Blok binaan ini penting untuk menulis aplikasi Rust yang cekap dan tidak menyekat!
Pelajari Rust dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 39
- Pelajaran
- 144
Soalan Lazim
Adakah pelajaran “Mengendalikan Future dan Tugasan” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Belajar Pengaturcaraan Rust, termasuk “Mengendalikan Future dan Tugasan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 3 pelajaran.
Apakah yang akan saya pelajari dalam “Mengendalikan Future dan Tugasan”?
Fahami trait `Future` serta cara tugasan dijadualkan dan diurus dalam persekitaran masa jalan tak segerak. Anda berlatih Belajar Pengaturcaraan Rust menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Belajar Pengaturcaraan Rust?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Belajar Pengaturcaraan Rust di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 3.
Berapa lamakah pelajaran “Mengendalikan Future dan Tugasan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Belajar Pengaturcaraan Rust ini?
Ya. Setiap pelajaran Belajar Pengaturcaraan Rust menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengenalan kepada Async/Await
- Membina Aplikasi Tak Segerak dengan Tokio
- Mengendalikan Future dan Tugasan