rust异步编程的基础概念 | 1.异步函数:使用async关键字定义一个异步函数,异步函数返回一个实现了Future特性的类型,这个Feature类型代表一个可能还未完成的计算 Feature特性的类型:rust的Feature就像一个将来会完成的任务 或者 一个将来会实现的承诺 2.Future: 代表异步操作最终的结果。 3.轮询:由异步运行(tokio 或 async-std)来管理 4.任务调度器:管理多个任务执行 |
异步编程的基本结构 | 1.定义异步函数 async fn my_async_function() -> Result<String, std::io::Error> { Ok("Hello World".to_string()) } 2.调用异步函数 let result = my_async_function().await; 解释: 1.调用异步函数 实际上是在创建 Future 2.Future代表了一个异步操作,但它本身不会立即开始执行 3.运行异步代码 #[tokio::main] async fn main(){ let result = my_async_function().await println!("{}",result.unwrap()); } 解释: 1.要使第二步的Future开始执行,必须放入一个异步运行(Tokio,Async-Std等) 2.异步运行时负责调度和执行这些Future |
异步流 | 1.什么是异步流 1.异步流就像是一个流水线,会不断给你发过来数据。而你每收到一条数据,就可以马上处理这条数据 2.不需要等所有数据都到齐了再处理 2.为什么使用异步流 1.节省内存:不一次性把所有数据放到内存 2.提高效率:尽早处理已经接收的数据 不用等待所有数据都准备好 3.示例 #[tokio::main] async fn main() { let mut message = receive_message(); //receive_message返回一个异步流 while let Some(message) = messages.next().await { //每次接收到一条消息,就可以立即处理这条消息 match message { Ok(msg) => println!("收到消息: {}", msg), Err(e) => eprintln!("出错: {}", e), } } } |
rust实现并发编程的方式 | 1.使用 tokio::spawn 启动新的异步任务 2.使用 tokio::join! 等待多个任务完成 |
并发编程的示例 | 1.定义异步函数 use reqwest; async fn download_data(url: &str) -> Result<String, reqwest::Error> { let response = reqwest::get(url).await?; //发起网络请求 使用.await等待请求完成 response.text().await //获取响应的文本内容 } 2.启动多个异步任务 use tokio; #[tokio::main] async fn main() { let urls = vec![ //包含需要下载的URL "https://example.com/data1", "https://example.com/data2", "https://example.com/data3", ]; let tasks: Vec<_> = urls.into_iter() .map(|url| tokio::spawn(download_data(url))) //map方法遍历urls,每个url调用tokio::spawn启动一个新的异步任务 .collect(); //返回JoinHandle 讲joinHandle收集到一个向量tasks 3.等待所有任务执行 for task in tasks { match task.await { //返回一个Result<_,_> 表示任务的执行结果 Ok(result) => match result { Ok(data) => println!("下载完成: {}", data), Err(e) => eprintln!("下载出错: {}", e), }, Err(e) => eprintln!("任务出错: {}", e), } } } |
rust学习_异步编程
最新推荐文章于 2025-04-23 10:59:53 发布