Trustport 2019-12-16
首先来看一个普通的函数:
use std::fs::File; use std::io::{self, Read}; fn read_file(path: &str) -> io::Result<String> { let mut file = File::open(path)?; let mut buffer = String::new(); file.read_to_string(&mut buffer)?; Ok(buffer) }
将这个函数用Async-std改成异步函数只需要改成这样:
use async_std::fs::File; use async_std::prelude::*; use async_std::io; async fn read_file(path: &str) -> io::Result<String> { let mut file = File::open(path).await?; let mut buffer = String::new(); file.read_to_string(&mut buffer).await?; Ok(buffer) }
嗯,没错,只要将std
替换成async-std
,并且在适当的位置加上async
或者await
即可。
We used async-std internally. We just replaced "std" by "async-std" and added "async" / "await" at the right places. ——Pascal Hertleif
async
简单来说,在函数前使用async
关键词等价于:
use async_std::fs::File; use async_std::prelude::*; use async_std::io; fn read_file(path: &str) -> impl Future<Item=io::Result<String>> { let mut file = File::open(path).await?; let mut buffer = String::new(); file.read_to_string(&mut buffer).await?; Ok(buffer) }
.await
如同字面意思,.await
标注了需要等待运行完成的地方。
fn main() { let data = read_file("./Cargo.toml"); // futures do nothing unless you '.await' or poll them }
async_std::task
task::block_on
This blocks the main thread, executes the future and wait for it to come back.task::spawn
This runs a background task and then waits for its completion, blocking the main thread.task::spawn_blocking
The returned JoinHandle is exactly the same as for a blocking task..race
.join
futures-rs also provides join_all, joining multiple futuresasync_std::sync::channel
例如:
fn read_from_tcp(socket: async_std::net::TcpSocket) { // for applications }
async/.await with async-std by Florian Gilcher