Rust 标准库中的 async/await (async-std)
Rust 对齐标准库中的async/await(async-std)
简介
现在的rust生态中,async/await在rust1.39中已经stable,其他库还有futures 已经到0.3.x,还有就是本次说的这个async-std,async-std主要使用的就是标准库中的Future,它也会依赖futures库,包含futures库中的一些特性,其实标准库中的Future也是移植了futures库中的Future.
async/await
async和await是可以分开的两个术语,分开理解(针对Rust语言的,其他语言就很不一样)
- async:产生一个Future对象,一个没有任何作用的对象,必须由调用器调用才会有用
- await: 等待异步操作完成(基于语义理解,其实很多情况只有调用future.await才是事实上去调用,具体是不是之前就开始执行,这个要看我们的调用器是什么),这步是阻塞当前线程,这个语法属于Future对象才能调用,而且必须要在async函数内
这列出三个异步基础作用
- 延迟计算:不需要立即得到结果
- 并发:多个操作并发执行,像多线程执行操作
- 独立性:(暂时不理解)
async语法
1.在函数前添加async关键字
async fn async_test(){
println!("hello async");
}
2:async闭包
async || {
println!("hello async");
}
3: async move
fn async_test() -> impl Future<Output =Result<(),String>>{
async move {
println!("hello async");
Ok(())
}
}
再次提醒:带有async关键字的函数直接调用是没有任何作用的,比如下面的调用 async_test();不会打印任何东西
Future
上面说的三种,都会生成一个Future,看看Futrue定义
pub trait Future {
type Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}
执行器(task executor)
把task放到这来说,就把它理解为Future就是我们要做任务的一个细节描述,task呢就是这些根据这些细节描述去做,下面就是怎么做的一些具体实现
block_on:阻塞调用,会阻塞当前线程直到有结果返回
spawn : 异步并发调用,类似多线程同时调用,这个函数会返回 JoinHandle,
例子
待补充
文件
use async_std::{
fs::File, // 支持异步操作的文件结构体
task, // 调用调度器
prelude::* // Future或输入输出流
};
fn main() {
// 阻塞运行Future
task::block_on(file_test());
}
/// 读取一个文件中的64个字节(十进制表示)
async fn file_test() ->Result<(), std::io::Error>{
let mut file = File::open("d:\\ABC.txt").await?;// ?号表示如果Err,会直接返回
let mut buffer:[u8; 64] = [0; 64];// 创建一个64个长度的字节数组
let n = file.read(&mut buffer).await?; // 每个await都是阻塞
println!("The bytes: {:?}", &buffer[..n]);
Ok(())
}
网络
待补充
结束语
从java转过来的,有可能对async/await这个特性比较混乱,java中的Future异步就是多线程調用,在rust中的Future又要复杂些
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: