这是一段来自async-std的例子
let socket = UdpSocket::bind("127.0.0.1:8080").await?;
println!("Listening on {}", socket.local_addr()?);
let mut buf = vec![0u8; 1024];
loop {
let (recv, peer) = socket.recv_from(&mut buf).await?;
let sent = socket.send_to(&buf[..recv], &peer).await?;
println!("Sent {} out of {} bytes to {}", sent, recv, peer);
}
我想问这样子看起来,不是就只能处理完一个连接再处理下一个连接吗,这跟同步好像没有区别。
还有一个问题就是如何令多个future同时运行呢, 谷歌到的例子都是用join,但是join只是令两个future同时运行,假设我有10个future(比如同时读取10个文件?不知道这个例子举的对不对),如何让这10个future同时运行,然后等待并得到返回值呢。
tokio和async-std都有task::spawn,但是并没有相关的例子,所以我在想创建过多的task是不是不应该呢?
1
共 10 条评论, 1 页
评论区
写评论多个 future 可以用 https://docs.rs/futures/0.3.1/futures/future/fn.join_all.html
spawn 的用法可以参考 https://github.com/tokio-rs/tokio/blob/master/examples/echo.rs
哦,就是说这个loop里发生一个阻塞的时候,会调度去执行下一个任务。然后回来看看这个阻塞完没有。这样子吗 对以下内容的回复:
是不是也就是说其实异步是 在一次任务里同时处理几个future ,而不是 能同时处理所有future呢。
emm用这段代码来举例,就是说在处理一个连接的时候,可以同时执行n个io任务,但是必须等全部处理完,然后才能处理下一个连接。
还是,可以说在处理a连接的时候,执行了一个阻塞10秒的io任务,在a连接发生io阻塞的时候,会自动切换到下一个b连接去执行b连接的处理呢。
对以下内容的回复:
不是的。await 就是一个调度点,运行时会切换到其他任务。具体原理看看资料吧。
我的理解是,这段代码确实和同步没什么区别,想要异步的效果得用spawn。Futures真正牛逼在于随意组合,比如join、select等,在同一个spawn里面select多个io或者net的Futures就类似于io多路复用的效果,而async/await则提供了一种类似同步思维的人性化语法。
我的理理解是io操作都是很耗时的 同步就是真的一直在等着,用了异步在等的时候可以做其它事情.(仅供参考) async_std 多个任务执行的一个例子供参考:
fn demo_downloading_urls_on_multiple_threads() { let mut tasks = Vec::with_capacity(URLS.len());
}
测试一下2 对以下内容的回复:
啥情况。
测试一下 对以下内容的回复:
测试评论