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

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

Image placeholder
vanntian
未设置
  42人点赞

没有讨论,发表一下自己的看法吧

推荐文章
CentOS7 下使用 rsync+sersync 配置文件自动同步

为什么需要文件自动同步功能? 我们平时上传代码,可以通过ftp、sftp等将文件上传至服务器,耗时耗力,而且很容易出错。如果服务器数量少还好,一但服务器数量增加,压力可想而知。 这个时候我们可以使用各

Linux 文件同步工具之 rsync

学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器。但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器

利用 consul+nginx-upsync 实现动态负载

如果Nginx遇到大流量和高负载,修改配置文件重启可能并不总是那么方便,因为恢复Nginx并重载配置会进一步增加系统负载,并很可能暂时降低性能。而一个个修改配置文件也是很容易出错和费时间的操作。 这时

利用 consul+nginx-upsync 实现动态负载

这是前一段时间学习的课程上面的,自己实际操作了一下,详细操作及说明如下。如果Nginx遇到大流量和高负载,修改配置文件重启可能并不总是那么方便,因为恢复Nginx并重载配置会进一步增加系统负载,并很可

死磕Synchronized底层实现,面试你还怕什么?

关于 synchronized 的底层实现,网上有很多文章了。但是很多文章要么作者根本没看代码,仅仅是根据网上其他文章总结、照搬而成,难免有些错误;要么很多点都是一笔带过,对于为什么这样实现没有一个说

深入了解JavaScript async/await !

Asyncfunctions让我们以async这个关键字开始。它可以被放置在任何函数前面,像下面这样:asyncfunctionf(){ return1; }在函数前面的「async」这个单词表达了一

ES6问答-async函数

async函数 async是什么?它和Genernator函数外观上的区别是什么? constasyncReadFile=asyncfunction(){ constf1=awaitreadFile

数据库中间件分片算法之stringhash

前言又是一个夜黑风高的晚上,带上无线耳机听一曲。突然很感慨一句话:生活就像心电图,一帆风顺就证明你挂了。就如同我们干运维的,觉得很简单的事情,有时候能干出无限可能。还是言归正传吧,这一次我们来说说st

低代码开发平台生存在标准化之外

这一次连续创业者任向晖找到他的PMF了。4月28日,明道更名为明道云,任向晖带着他的团队从SaaS协同向低代码开发平台(LowCodePlatform)转舵,而这并非孤例,更早一些还有从九章全协同转型

当Kubernetes成为云操作系统的标准应用,AWS也亮出了“杀手锏”!

作为云计算领域的排头兵,AWS一直是“老大哥”形象,他的一举一动都牵动着无数人的神经。AWS不仅在云计算领域投入时间早、运行时间长、客户多,在无服务器、容器以及现代化应用工具开发方面,也是当之无愧的引

中国联通容器化之路及选型标准

“容器”的概念灵感来源于集装箱,有了集装箱,货物不会杂乱无章地堆放在一起,易于管理,也方便运输。容器技术也被称为轻量化虚拟化技术,与集装箱的作用相似。相比前网红虚拟机,容器技术凭借其轻量化、快速部署以

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR中直播页面和视频列表页面的区别介绍

背景分析随着平安城市、智慧城市、雪亮工程、智能交通等各项建设的持续开展,安防逐渐得到普及,面对如此广阔的市场,对安防企业来说不仅仅是机遇更多的是挑战。现今大多数摄像头一直没能摆脱人工监控的传统监控方式

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR如何使用Excel将通道配置简单化?

进入移动互联网时代以来,企业微信公众号已成为除官网以外非常重要的宣传渠道,当3.2亿直播用户与9亿微信用户的势能累加,在微信上开启直播已成为越来越多企业的必然选择。EasyNVR核心在于摄像机的音视频

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR登陆用户名密码失效问题解决方案

背景分析随着互联网基础设施建设的发展,4G/5G/NB-IoT各种网络技术的大规模商用,视频随时随地可看、可控的诉求越来越多,互联网思维、架构和技术引入进传统监控行业里,成为新形势下全终端监控的基础需

RTSP、RTMP网络摄像头互联网无插件直播视频流媒体服务器EasyNVR在windows上无法启动问题排查

背景需求随着雪亮工程、明厨亮灶、手机看店、智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网、微信直播,我们知道摄像头直播的春天了。将安防摄像头或NVR上的视频流转成互联网直播常用的RTSP、RTM

安防摄像头网页无插件直播流媒体服务器EasyNVR在IE浏览器下的 pointer-events- none前端兼容性调试

背景说明由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合是大势所趋。传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都需要OCXWeb插件进行直播。对于安防监控

RTSP-ONVIF协议安防视频监控流媒体服务解决方案EasyNVR在Windows重启时提示“进程意外终止”问题解析

什么是ONVIFOpenNetworkVideoInterfaceForum,开放型网络视频接口论坛,以公开、开放的原则共同制定开放性行业标准。是一个提供开放网络视频接口的论坛组织。ONVIF规范描述

安防摄像头RTSP/Onvif协议网页无插件直播视频流媒体服务器EasyNVR之按需直播如何有效利用最大上行带宽

介绍一般情况下,直播默认的播放方式是非按需直播,但很多情况下,不少用户会选择按需直播。按需直播能够减少带宽流量和服务器性能占用,最优的提高服务器的使用效率。下面我们来系统介绍下EasyNVR中按需直播

RTSP网络摄像头/海康大华硬盘录像机网页无插件直播方案EasyNVR如何实现RTMP/FLV/HLS/RTSP直播流分发

背景需求对于摄像机直播,客户反馈的最多就是实现web直播、摆脱插件,可以自定义集成等问题。我们熟悉的EasyNVR已经完美的解决了这些问题。然而对于web播放也存在一些问题,通常我们web播放RTMP

分享一款支持多种短信服务商 Hyperf 组件,基于 overtrue/easy-sms 组件改造

一款支持多种短信服务商Hyperf组件1.新增配置文件phpbin/hyperf.phpvendor:publishhyperf-libraries/sms2.修改配置

用 Rust 刷 leetcode 第二题

Problem Youaregiventwonon-emptylinkedlistsrepresentingtwonon-negativeintegers.Thedigitsarestoredinre

为什么要学习 Rust

缘起为什么学习Rust?于我而言,也许是两年前当我迈入区块链的第一脚时就已经决定了。选择一门编程语言是很困难的,但却又是重要的,其重要程度绝对不亚于你选择在哪个地方买房子或者是你选择在哪个地方扎根发展

用 Rust 刷 leetcode 第一题

problemGivenanarrayofintegers,return indices ofthetwonumberssuchthattheyadduptoaspecifictarget. Youm

用 Rust 刷 leetcode 第二题

ProblemYouaregiventwo non-empty linkedlistsrepresentingtwonon-negativeintegers.Thedigitsarestoredin 

配置 Horizon 的 queue, balance, processes 参数以及 Redis 中的优先级

我假设你正在使用redis和 LaravelHorizon,要开始配置horizon,仅需用我下面的命令清空所有进程队列任务中horizon的仪表盘。我也曾在本系列的a教程中描述过 链接:phpar