Repository navigation
【作业打卡】Week5. 模块五:并发编程和异步编程 #30
Replies: 7 comments
如何理解 Rust 中的并发编程和异步编程?并发:一个内核交替处理多个任务,由操作系统来切换线程 异步:发生在1个线程内,避免切换线程。异步任务在等待IO操作时可以挂起,不需要占用线程;当IO操作完成时,异步任务可以继续执行。 尝试编写一个并发程序以下程序创建两个线程,每个线程并发执行10个子任务 使用社区中你喜欢的异步运行时编写一个小程序以下程序创建两个异步任务,每个任务都会休眠一段时间并print一些信息 |
单说,并发指的是,将不同的任务拆分成两条线。 异步编程: 再编程中,多体现为事件回调机制。
以下是一个并发产生账号的代码。 线程对象存储到 handlers 中,用于主线程的等待。 let mut handlers = vec![];
let accounts = vec![];
let accounts_arc: Arc<Mutex<Vec<SuiAccount>>> = Arc::new(Mutex::new(accounts));
for thread_no in 1..=3 {
let handle_resource = Arc::clone(&accounts_arc);
let handle = thread::spawn(move || {
for i in 1..=5 {
let account: SuiAccount = SuiAccount::new_account();
println!(
"thread {:0>4} create account No.{:0>3} {}",
thread_no, i, account
);
let mut _guard = handle_resource.lock().unwrap();
_guard.push(account);
}
});
handlers.push(handle);
}
for handler in handlers {
handler.join().unwrap();
}.3. 异步操作代码: async 声明为异步方法。 #[tokio::main]
async fn main() {
let network = network();
let object_id = "0x2dfc31f14cc8b0040407e818568fa37e95e52281b684b67050ab32a16942d955";
println!("gateway is : {}", network.get_gateway());
println!("network is : {}", network);
println!("object link is : {} ", network.object_link(object_id));
network.get_object_id(object_id).await;
}
`` |
如何理解 Rust 中的并发编程和异步编程?并发编程 是指在单个程序中同时进行多个任务。这是通过在程序中创建并使用线程来完成的。每个线程可以并行(如果系统有多个处理器)或者并发地(如果系统只有一个处理器)执行任务。使用 异步编程 是一种编程范式,它通过允许任务延迟完成以释放系统资源来提高性能和响应性。在 Rust 中,异步编程通常用于 I/O 操作,如网络或磁盘操作。Rust 的异步编程模型依赖于 Futures 和 async/await 语法。Future 是一个可以在将来某个时刻完成的任务,它返回一个结果或错误。async/await 语法是构建和管理这些 Futures 的一种方式。 尝试编写一个并发程序使用社区中你喜欢的异步运行时编写一个小程序 |
1. 如何理解 Rust 中的并发编程和异步编程?
2. 尝试编写一个并发程序// 通过Arc和Mutex实现多线程数据共享
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// Mutex Lock
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut count = counter.lock().unwrap();
*count += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Counter: {}", *counter.lock().unwrap());
}3. 使用社区中你喜欢的异步运行时编写一个小程序use tokio::time::{sleep, Duration};
async fn async_task() {
println!("异步任务: start");
// 模拟异步操作,这里使用 sleep 来模拟耗时操作
sleep(Duration::from_secs(2)).await;
println!("异步任务:end");
}
#[tokio::main]
async fn main() {
println!("主程序 start");
// 创建异步任务并等待其完成
let task = async_task();
task.await;
println!("主程序 end");
} |
异步编程是一种基于事件驱动的编程模型,其中任务的执行不会阻塞主线程或其他任务的执行。Rust提供了异步编程的支持,通过async/await语法和异步运行时来实现。异步编程可以提高程序的性能,特别适用于I/O密集型的任务,如网络请求、文件操作等。Rust的异步编程模型借鉴了Async/Await模式,使得编写异步代码更加直观和易于理解。
use std::thread;
fn main() {
let handle1 = thread::spawn(|| {
for i in 1..=5 {
println!("Task 1: {}", i);
thread::sleep_ms(1000); // 模拟耗时操作
}
});
let handle2 = thread::spawn(|| {
for i in 1..=5 {
println!("Task 2: {}", i);
thread::sleep_ms(1000); // 模拟耗时操作
}
});
handle1.join().unwrap();
handle2.join().unwrap();
}在这个示例中,我们使用thread::spawn函数创建了两个线程,每个线程执行一个任务。任务使用for循环打印一系列数字,并通过thread::sleep_ms函数模拟了一个耗时操作。主线程通过调用join方法等待子线程的结束。
use tokio::time::{sleep, Duration};
async fn do_something_async() {
println!("Async task started");
sleep(Duration::from_secs(2)).await;
println!("Async task completed");
}
#[tokio::main]
async fn main() {
println!("Main task started");
do_something_async().await;
println!("Main task completed");
}在这个示例中,我们使用tokio异步运行时的宏标记了main函数,并在其中调用了do_something_async异步函数。异步函数使用async关键字标记,并在函数内部通过await关键字等待一个异步任务完成。在main函数中,我们先打印一条开始消息,然后调用异步函数,并用await等待它的完成。最后打印一条完成消息。运行这个程序将会看到异步任务和主任务是同时执行的。 |
|
1、如何理解Rust中的并发编程和异步编程? 3、使用社区中你喜欢的异步运行时编写一个小程序 |
1. 如何理解 Rust 中的并发编程和异步编程?并发编程和异步编程是处理并行执行任务和处理异步事件的两种重要方式。 2. 尝试编写一个并发程序use std::thread;
fn main() {
let handle1 = thread::spawn(|| {
for i in 1..=5 {
println!("Thread 1: {}", i);
thread::sleep(std::time::Duration::from_millis(500));
}
});
let handle2 = thread::spawn(|| {
for i in 1..=5 {
println!("Thread 2: {}", i);
thread::sleep(std::time::Duration::from_millis(500));
}
});
let handle3 = thread::spawn(|| {
for i in 1..=5 {
println!("Thread 2: {}", i);
thread::sleep(std::time::Duration::from_millis(500));
}
});
handle1.join().unwrap();
handle2.join().unwrap();
handle3.join().unwrap();
}3. 使用社区中你喜欢的异步运行时编写一个小程序使用 use tokio::fs::File;
use tokio::io::{self, AsyncReadExt};
#[tokio::main]
async fn main() -> io::Result<()> {
let file_path = "path/to/file.txt";
let mut file = File::open(file_path).await?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer).await?;
// 打印文件内容
println!("File Content: {:?}", buffer);
Ok(())
} |
Uh oh!
There was an error while loading. Please reload this page.
All reactions