面试题答案
一键面试use tokio::stream::{self, StreamExt};
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
let numbers_stream = stream::iter(1..)
.map(|num| async move {
sleep(Duration::from_secs(1)).await;
num
})
.flatten();
let consumer = tokio::spawn(async move {
numbers_stream.for_each(|num| async {
if num % 3 == 0 {
println!("{} is divisible by 3", num);
}
}).await;
});
consumer.await.unwrap();
}
Tokio异步流的优势
- 高效的资源利用:Tokio的异步流基于异步I/O和非阻塞操作,允许在等待I/O操作完成时执行其他任务,从而提高系统资源的利用率,特别是在处理大量并发任务时,避免了线程的阻塞和上下文切换开销。
- 简洁的异步编程模型:异步流提供了一种简洁的方式来处理异步迭代数据,通过
Stream
trait和相关的扩展方法(如StreamExt
),可以使用类似于同步迭代器的语法来处理异步数据流,使异步编程更易于理解和维护。 - 灵活的组合和转换:可以方便地对异步流进行组合、转换和过滤等操作,例如使用
map
、filter
、for_each
等方法,以满足不同的业务需求。
StreamExt
trait的作用
StreamExt
trait为Stream
trait提供了一系列的扩展方法。这些方法极大地增强了Stream
的功能,使得处理异步流更加方便。例如:
map
方法:可以将流中的每个元素进行转换,类似于同步迭代器中的map
,只不过这里处理的是异步操作。filter
方法:用于过滤流中的元素,只保留满足特定条件的元素。for_each
方法:对每个元素执行一个异步闭包,在这里我们就使用它来消费流中的数据,并打印出能被3整除的数字。通过这些扩展方法,可以在不改变Stream
trait本身的基础上,为异步流增加丰富的操作能力。