面试题答案
一键面试- 并发执行管理:
- 使用
tokio::spawn
来创建并并发执行多个Future
任务。tokio::spawn
将一个Future
封装成一个异步任务并在Tokio
运行时中调度执行。 - 例如,假设有两个
Future
任务future1
和future2
:
- 使用
use tokio;
#[tokio::main]
async fn main() {
let future1 = async {
// 任务1的具体逻辑
println!("Task 1 is running");
};
let future2 = async {
// 任务2的具体逻辑
println!("Task 2 is running");
};
let handle1 = tokio::spawn(future1);
let handle2 = tokio::spawn(future2);
handle1.await.unwrap();
handle2.await.unwrap();
}
- 处理资源竞争问题:
- 使用
tokio::sync::Mutex
来保护共享资源。Mutex
(互斥锁)可以保证在同一时间只有一个任务能够访问共享资源,从而避免资源竞争。 - 以下是一个多个任务访问并修改同一个共享资源的示例代码架构和关键处理逻辑:
- 使用
use tokio::sync::Mutex;
#[tokio::main]
async fn main() {
let shared_resource = Mutex::new(0);
let task1 = async move {
let mut data = shared_resource.lock().await;
*data += 1;
println!("Task 1 modified shared resource to: {}", *data);
};
let task2 = async move {
let mut data = shared_resource.lock().await;
*data += 2;
println!("Task 2 modified shared resource to: {}", *data);
};
let handle1 = tokio::spawn(task1);
let handle2 = tokio::spawn(task2);
handle1.await.unwrap();
handle2.await.unwrap();
}
在上述代码中:
- 定义了一个
Mutex
包裹的共享资源shared_resource
。 - 每个任务通过
shared_resource.lock().await
获取锁,这是一个异步操作,会暂停当前任务直到获取到锁。 - 一旦获取到锁,就可以安全地访问和修改共享资源,当作用域结束时,锁会自动释放,其他任务就有机会获取锁并访问共享资源,这样就保证了数据的一致性和正确性。