菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
42
0

Rust 标准库中的 async/await (async-std)

原创
05/13 14:22
阅读数 819

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语言的,其他语言就很不一样)

  1. async:产生一个Future对象,一个没有任何作用的对象,必须由调用器调用才会有用
  2. await: 等待异步操作完成(基于语义理解,其实很多情况只有调用future.await才是事实上去调用,具体是不是之前就开始执行,这个要看我们的调用器是什么),这步是阻塞当前线程,这个语法属于Future对象才能调用,而且必须要在async函数内

这列出三个异步基础作用

  1. 延迟计算:不需要立即得到结果
  2. 并发:多个操作并发执行,像多线程执行操作
  3. 独立性:(暂时不理解)

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又要复杂些

发表评论

0/200
42 点赞
0 评论
收藏
为你推荐 换一批