面试题答案
一键面试设计思路
- 使用异步通道:利用Rust的
async_channel
库创建一个通道,用于在计算线程和输出线程之间传递计算结果。这样计算线程不会因为等待控制台输出而阻塞。 - 异步任务:将控制台输出操作封装在一个异步任务中,使用
tokio
等异步运行时来管理这个任务,确保其在后台执行,不阻塞主线程。 - 互斥锁(Mutex):为了处理
write!
宏可能遇到的竞争问题,在访问控制台输出时使用Mutex
来保护共享资源。
核心代码实现
use async_channel::{bounded, Receiver, Sender};
use std::sync::Mutex;
use tokio::task;
// 创建一个用于存储计算结果的结构体
struct ComputationResult {
data: String,
}
// 异步函数,模拟计算任务
async fn compute_task(sender: Sender<ComputationResult>) {
for i in 0..10 {
let result = ComputationResult {
data: format!("计算结果: {}", i),
};
sender.send(result).await.expect("发送计算结果失败");
}
}
// 异步函数,处理控制台输出
async fn print_task(receiver: Receiver<ComputationResult>) {
let console_mutex = Mutex::new(());
while let Ok(result) = receiver.recv().await {
let _guard = console_mutex.lock().unwrap();
println!("{}", result.data);
}
}
#[tokio::main]
async fn main() {
let (sender, receiver) = bounded(100);
task::spawn(compute_task(sender));
task::spawn(print_task(receiver));
// 等待所有任务完成(这里简单等待一段时间)
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
}
在上述代码中:
compute_task
函数模拟高并发计算任务,将计算结果通过通道发送出去。print_task
函数从通道接收计算结果,并使用Mutex
来确保println!
(基于write!
宏)操作的线程安全,实现异步输出到控制台。- 在
main
函数中,创建了异步通道,并使用tokio::task::spawn
将两个异步任务加入到异步运行时中执行。