线程

June 2, 2024

std::thread::spawn

std::thread::spawn 创建一个操作系统级的线程,这些线程在操作系统层面进行调度。它适用于 CPU 密集型任务或者需要与外部库进行 同步操作 的任务。

示例代码

use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        // 在新的线程中执行
        for i in 1..10 {
            println!("在新线程中:{}", i);
            std::thread::sleep(std::time::Duration::from_millis(1));
        }
    });

    // 在主线程中执行
    for i in 1..5 {
        println!("在主线程中:{}", i);
        std::thread::sleep(std::time::Duration::from_millis(1));
    }

    handle.join().unwrap();
}
spawn 接收一个闭包参数。

tokio::spawn

tokio::spawn 创建一个异步任务,这些任务在 Tokio 运行时中进行调度。它适用于 I/O 密集型任务或者需要与其他 异步操作 进行协作的任务。

示例代码

use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() {
    let handle = tokio::spawn(async {
        // 在新的异步任务中执行
        for i in 1..10 {
            println!("在新异步任务中:{}", i);
            sleep(Duration::from_millis(1)).await;
        }
    });

    // 在主异步任务中执行
    for i in 1..5 {
        println!("在主异步任务中:{}", i);
        sleep(Duration::from_millis(1)).await;
    }

    handle.await.unwrap();
}

async & await

asyncawait 是用于编写异步代码的关键字,它们与 Tokio 一起使用。

可以使用 async 关键字定义一个异步函数。异步函数在调用时不会立即执行,而是返回一个实现了 Future 特性的对象。这个 Future 可以被 .await 调用,以等待它的完成。

async fn say_hello() {
    println!("Hello, world!");
}

await 关键字用于等待异步操作完成。当一个 Future.await 调用时,当前任务将被挂起,直到 Future 完成。这使得程序可以在等待期间执行其他任务,从而实现高效的并发。

async fn main() {
    say_hello().await;
}

Future

join! 宏用于并行执行多个异步任务并等待它们完成。

use tokio::time::{sleep, Duration};

async fn task1() {
    sleep(Duration::from_secs(2)).await;
    println!("Task 1 completed");
}

async fn task2() {
    sleep(Duration::from_secs(3)).await;
    println!("Task 2 completed");
}

#[tokio::main]
async fn main() {
    tokio::join!(task1(), task2());
    println!("Both tasks completed");
}

🤖 面试

最后更新于