當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust spawn用法及代碼示例


本文簡要介紹rust語言中 Function std::thread::spawn 的用法。

用法

pub fn spawn<F, T>(f: F) -> JoinHandle<T> where    F: FnOnce() -> T,    F: Send + 'static,    T: Send + 'static,

產生一個新線程,為其返回一個 JoinHandle

連接句柄提供了一個 join 方法,可用於連接生成的線程。如果生成的線程出現Panics, join 將返回一個 Err ,其中包含提供給 panic! 的參數。

如果刪除連接句柄,則生成的線程將隱式分離。在這種情況下,生成的線程可能不再被連接。 (程序有責任最終加入它創建的線程或分離它們;否則,將導致資源泄漏。)

此調用將使用 Builder 的默認參數創建一個線程,如果要指定堆棧大小或線程名稱,請改用此 API。

正如您在 spawn 的簽名中看到的那樣,給 spawn 的閉包及其返回值都有兩個約束,讓我們解釋一下:

  • 'static 約束意味著閉包及其返回值必須具有整個程序執行的生命周期。這樣做的原因是線程可以超過它們被創建的生命周期。

    事實上,如果線程及其返回值可以比它們的調用者更長壽,我們需要確保它們之後有效,並且因為我們不能知道它何時返回,我們需要讓它們盡可能長時間地有效,即直到程序結束,因此'static壽命。

  • Send約束是因為閉包需要通過按值從它產生的線程到新線程。它的返回值需要從新線程傳遞到它所在的線程join編輯。提醒一下,Send標記特征表示從一個線程傳遞到另一個線程是安全的。Sync表示將引用從一個線程傳遞到另一個線程是安全的。

Panics

如果操作係統無法創建線程,則會出現Panics;使用 Builder::spawn 從此類錯誤中恢複。

例子

創建線程。

use std::thread;

let handler = thread::spawn(|| {
    // thread code
});

handler.join().unwrap();

如模塊文檔中所述,線程通常使用 channels 進行通信,這是它通常的外觀。

此示例還展示了如何使用 move 來將值的所有權授予線程。

use std::thread;
use std::sync::mpsc::channel;

let (tx, rx) = channel();

let sender = thread::spawn(move || {
    tx.send("Hello, thread".to_owned())
        .expect("Unable to send on channel");
});

let receiver = thread::spawn(move || {
    let value = rx.recv().expect("Unable to receive from channel");
    println!("{}", value);
});

sender.join().expect("The sender thread has panicked");
receiver.join().expect("The receiver thread has panicked");

一個線程也可以通過它的 JoinHandle 返回一個值,你可以使用它來進行異步計算(雖然未來可能更合適)。

use std::thread;

let computation = thread::spawn(|| {
    // Some expensive computation.
    42
});

let result = computation.join().unwrap();
println!("{}", result);

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Function std::thread::spawn。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。