RUST Ex00 Async-std
RUST Ex00 Async-std
1 使用Async-std
首先来看一个普通的函数:
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
2 浅析Async-std
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函数在被调用时生成futures
3 部分要素
async_std::tasktask::block_onThis blocks the main thread, executes the future and wait for it to come back.task::spawnThis runs a background task and then waits for its completion, blocking the main thread.task::spawn_blockingThe returned JoinHandle is exactly the same as for a blocking task.
.race.joinfutures-rs also provides join_all, joining multiple futuresasync_std::sync::channel
4 AsyncRead/Write/Seek
- AsyncRead: Read from a socket, asynchronously
- AsyncWrite: Write to a socket, asynchronously
- AsyncSeek: Write to a socket, asynchronously
例如:
fn read_from_tcp(socket: async_std::net::TcpSocket) {
// for applications
}参考
async/.await with async-std by Florian Gilcher
相关推荐
89500297 2020-06-07
前端开发Kingcean 2020-05-29
前端开发Kingcean 2020-01-23
85403263 2019-07-01
Bonrui编程路 2020-06-07
陈旭阳 2020-06-02
niehanmin 2020-05-19
Magicsoftware 2020-03-28
Magicsoftware 2020-03-28
LorenLiu 2020-03-28
lyg0 2020-02-18
88520191 2020-01-30
csuzxm000 2020-01-10
whynotgonow 2020-01-05
89500297 2020-01-03
88520191 2019-12-30
wujiajax 2014-01-13