rust 中的语法await!正式改成.await, 关于Future这套东东,很有必要了解。象actix-web也已经1.0了,里面其实也是到处Future这套。async、await这套东东,是rust的硬知识。

一、async和await的几种形式

“async和其他Future是懒惰的:它们在运行之前什么都不做。运行Future的最常见方式是.await它。当在Future上调用.await时,它将尝试运行以完成它。如果Future被阻止,它将让出当前线程。当可以取得更多进展时,执行者将获取 Future并将继续运行,以便.await解决。”

1、async
(1)async fn

当然,也有很多情况,比如函数中有.await; 也可能没有.await的不同情况。这种也会导致,返回值也完全不一样。
比如,

      async fn compute(){println!("async->");}

这个相当于:[只是相当于]

       fn compute()->impl Future<Output = ()>{println!("async->");}

(2)async 和async move

async {}后直接一个代码块。没有取环境变量的所有权。
“async move块将获取它引用变量的所有权,允许它活得比目前的范围长,但放弃了与其他代码分享那些变量的能力”。

比如:

  fn compute_01() -> impl Future<Output =Result<(),String>>{async move{for i in 1..10000{let _ = i*2;}println!("=>01 it is over!");Ok(())}}

(3)async闭包

  fn compute_05(value:i32)->impl Future<Output=i32>{let closure = async move |v:i32|{compute_03().await;v+1};closure(value)}

一个综合的例子:

sync fn hello(){println!("hello!");// async fn async fn world(){println!("world!");}world().await;// async blocklet a = async{println!("{:?}","hello world!");};a.await;// async move blocklet code ="shang hai".to_string();let mut hp = HashMap::new();hp.insert("code","600036");let b = async move{println!("hello world, i love {:?}",hp);};//println!("code:{:?}",hp); //error if uncommentedb.await;
}

2 、await
async并不必然就需要用await,但设计的初衷是想等.await调用。

在.await的调用上,需要注意两个方面,一方面是,什么情况下能用上.await;另一方面是, 用上.await函数本身有什么要求?
相当于,一个是从逻辑实质上的要求;另一个是外在形式上的要求;

(1)能用await的情况

await的用法很简单,一般主要有以下两个这中的一个条件,一种是显示的;一种是隐式的;

A、显示方式:调用的函数中与async相对应的安排的;比如,async; async move;

这种情况好理解,不详述。

B、隐式方式:没有明显的async相对应的安排,但函数的返回值实现了Future trait.

这种情况,是一种隐式的情况。比如,

  struct data{price :Vec<f64>}fn  get_data(length: i64) ->data{}//但data 实现了Future trait, 即impl Future for data{// 省略......}
//即实现的函数,有Poll<Self::Output>

(2)await有用时,函数体外面是一定有async这个壳套着的;

也就是说,只有函数的签名中有async,才允许用.await的;

async fn v(){m().await // .await 是因为v()外面的签名,一定有一个async.
}

另外,说明一下,当函数的返回值形式实现了impl Future<Output =Result<>>类型时,可以用.await?的形式。

3、block_on()

另外,提一下block_on(). 如果没有这个函数,所有的异步相当于“箭射出后,但收不回来”。
block_on() 相当于让这个异步安排强制完成。

二、实例

1、相关说明
(1)#![feature(async_await)]
有时,会更长一些,比如
#![feature(async_await, await_macro, futures_api)],具体来说,
async_await 增加了对 async fn 语法的支持。
await_macro 增加了对 await! 宏的支持。
futures_api 增加了对 nightly std::future 和 std::task 模块的支持,这些模块定义了核心Future特征和依赖类型。

(2)并在nightly的环境中

2、代码

  #![feature(async_await)]use std::thread;use std::time::Duration;use futures::{Future};use futures::executor::block_on;fn compute_01() -> impl Future<Output =Result<(),String>>{async move{for i in 1..10000{let _ = i*2;}println!("=>01 it is over!");Ok(())}}async fn compute_02(){println!("=>02 is entering....");compute_01().await;//compute_04().await;println!("=>02 is over!");}async fn compute_03(){println!("=>03 is entering....");for i in 1..10000{let _ = i*2;}println!("=>03 it is over!");}fn compute_04(){println!("=> 04 is entering....")}fn compute_05(value:i32)->impl Future<Output=i32>{let closure = async move |v:i32|{compute_03().await;v+1};closure(value)}fn main() {block_on(compute_02());//compute_03();block_on(compute_03());//必须把这些异步跑完let val = block_on(compute_05(6));println!("val :{:?}",val);println!("hello world!");thread::sleep(Duration::from_millis(500000));}

三、输出结果

=>02 is entering....
=>01 it is over!
=>02 is over!
=>03 is entering....
=>03 it is over!
=>03 is entering....
=>03 it is over!
val :7
hello world!

Rust : async、await 初探相关推荐

  1. rust异步编程--理解并发/多线程/回调/异步/future/promise/async/await/tokio

    1. 异步编程简介 通常我们将消息通信分成同步和异步两种: 同步就是消息的发送方要等待消息返回才能继续处理其它事情 异步就是消息的发送方不需要等待消息返回就可以处理其它事情 很显然异步允许我们同时做更 ...

  2. rust future async/await

    本文目录 hello world executor async generator await future futures库是很多人学习rust异步编程的第一站,今天我将通过一个简单的hello w ...

  3. 【Rust日报】 2019-08-12:Tokio alpha 版发布,新版本支持async/await

    Tokio alpha 版发布 #tokio 新版本支持async/await tokio = "=0.2.0-alpha.1" #![feature(async_await)]u ...

  4. async await:比requests 更强大

    最近公司 Python 后端项目进行重构,整个后端逻辑基本都变更为采用"异步"协程的方式实现.看着满屏幕经过 async await(协程在 Python 中的实现)修饰的代码,我 ...

  5. setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)

    本文很长,列举的情况很多. 在阅读本文之前,如果您有充足的时间,请新建一个项目与本文一同实践. 每段代码都有对应的解释,但是自己动手尝试印象才会更深哦~ setInterval:表示多久执行一次,需要 ...

  6. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  7. promise 和 async await区别

     什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. as ...

  8. angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )

    Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...

  9. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  10. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

    Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...

最新文章

  1. 倒排索引原理_拜托,面试请不要再问我分布式搜索引擎的架构原理!
  2. 编辑器的合并用不了_为什么图片和PDF合并后的PDF页面大小不一
  3. 博途v15安装过程中提示出错_博途V15.1安装及无限重启和.net3.5SP1错误处理解决方法...
  4. 布道微服务_10注册中心与RPC框架的选型
  5. windows下安装PyTorch0.4.0
  6. torch的拼接函数_从零开始深度学习Pytorch笔记(13)—— torch.optim
  7. vlan跨交换机 udp广播_【详解】VLAN和VXLAN有何区别?VXLAN运用场景有哪些?
  8. python pandas写入_51-python3 pandas读写excel
  9. (转)服务器控件三个ID
  10. Java中如何循环删除一个集合(如List)中的多个元素
  11. Araxis Merge pro for mac(文件对比合并同步工具)
  12. VCF 文件 格式 详解
  13. 苹果Apple TV+上线了重磅史诗级别科幻作品,这是要挑战Netflix、HBO?
  14. 扫地机器人朋友圈文案_匠龙扫地机器人广告片创意脚本文案
  15. vue实现下拉二级联动_Vue实现三级联动/多级联动/城市选择
  16. 安装es-header插件
  17. 年轻父母要注意,给孩子取名误区不能犯
  18. Centos 7安装Quagga
  19. 机器学习第四篇:详解决策树算法
  20. Android APK签名 JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore E:\xxxxxx- pkcs12“ 迁移到行业标准格式

热门文章

  1. ArcSDE:C#创建SDE要素数据集
  2. cocoapods导入afnetworking报错问题
  3. linux核心蜜罐系统,分析***,斩断黑手
  4. cocos2d笔记 (3)cocos2d四个基本概念
  5. win8 开发新格局分析
  6. 上海世博会物联网技术应用
  7. MySQL-第十一篇JDBC典型用法
  8. jvm参数-verbose:gc和-XX:+PrintGC有区别?
  9. Docker Compose 笔记
  10. Linux 系统中用户切换(su user与 su - user 的区别)