004 Rust 异步编程,async await 的详细用法

2022-12-30 0 573

他们以后单纯如是说了async/.await的用语,此栏将更详尽的如是说async/.await。

async的用语

async主要就有三种用语:async表达式和asyn标识符块(老版书中说的是四种主要就的用语,多了两个async旋量群)。这三种用语单厢回到两个Future第一类,如下表所示:

async fn foo() -> u8 { 5 } fn bar() -> impl Future<Output = u8> { // `Future<Output = u8>`. async { let x: u8 = foo().await; x + 5 } } fn baz() -> impl Future<Output = u8> { // implements `Future<Output = u8>` let closure = async |x: u8| { let y: u8 = bar().await; y + x }; closure(5) }

async转化成的Future第一类和其他Future那样是具备胶体的,即在运转以后甚么也不做。运转Future最常见的形式是.await。

async的开发周期

考量实例:

async fn foo(x: &u8) -> u8 { *x }

依照他们后面的科学知识,所以该表达式只不过同构于如下表所示:

fn foo<a>(x: &a u8) -> impl Future<Output = ()> + a { async { *x } }

那个触发器表达式回到两个Future第一类。假如他们把那个Future对象新浪网程间展开传达,所以则存有开发周期的难题。如下表所示:

//此种初始化就会存有开发周期的难题 fn bad() -> impl Future<Output = ()> { let x = 5; foo(&x) // ERROR: `x` does not live long enough }

恰当的初始化形式如下表所示:

fn good() -> impl Future<Output = ()> { async { let x = 5; foo(&x).await; } }

说明:通过将变量移动到async中,将延长x的开发周期和foo回到的Future开发周期一致。

async move

async 块和旋量群允许 move 关键字,就像普通的旋量群那样。两个 async

实例如下表所示

配置文件://Cargo.toml中添加 [dependencies] futures = “0.3.4源码://src/main.rs use futures::executor; async fn move_block() { let my_string = “foo”.to_string(); let f = async move { println!(“{}”, my_string); }; // println!(“{}”, my_string); //此处不能再使用my_string f.await } fn main() { executor::block_on(move_block()); }

多线程

在使用多线程Future的excutor时,Future可能新浪网程之间移动,因此在async主体中使用的任何变量都必须能够新浪网程之间传输,因为任何.await变量都可能导致切换到新线程。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务