< 返回版块

juzi5201314 发表于 2020-01-22 01:46

Tags:异步

这是一段来自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是不是不应该呢?

评论区

写评论
zyctree 2020-01-22 13:32

多个 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

作者 juzi5201314 2020-01-22 10:47

哦,就是说这个loop里发生一个阻塞的时候,会调度去执行下一个任务。然后回来看看这个阻塞完没有。这样子吗 对以下内容的回复:

作者 juzi5201314 2020-01-22 10:45

是不是也就是说其实异步是 在一次任务里同时处理几个future ,而不是 能同时处理所有future呢。

emm用这段代码来举例,就是说在处理一个连接的时候,可以同时执行n个io任务,但是必须等全部处理完,然后才能处理下一个连接。

还是,可以说在处理a连接的时候,执行了一个阻塞10秒的io任务,在a连接发生io阻塞的时候,会自动切换到下一个b连接去执行b连接的处理呢。

对以下内容的回复:

Ryan-Git 2020-01-22 10:39

不是的。await 就是一个调度点,运行时会切换到其他任务。具体原理看看资料吧。

jmjoy 2020-01-22 10:29

我的理解是,这段代码确实和同步没什么区别,想要异步的效果得用spawn。Futures真正牛逼在于随意组合,比如join、select等,在同一个spawn里面select多个io或者net的Futures就类似于io多路复用的效果,而async/await则提供了一种类似同步思维的人性化语法。

93996817 2020-01-22 09:07

我的理理解是io操作都是很耗时的 同步就是真的一直在等着,用了异步在等的时候可以做其它事情.(仅供参考) async_std 多个任务执行的一个例子供参考:

fn demo_downloading_urls_on_multiple_threads() { let mut tasks = Vec::with_capacity(URLS.len());

for url in URLS.iter() {
    let url = url.to_string();
    tasks.push(task::spawn(async move {
        match download_url(&url).await {
            Ok(body) => { // Possibly do something useful with the body of the request here.
            },
            Err(e) => println!("    Got error {:?}", e),
        }
    }))
}

task::block_on(async {
    for t in tasks {
        t.await;
    }
});

}

id-sb 2020-01-22 07:36

测试一下2 对以下内容的回复:

id-sb 2020-01-22 07:35

啥情况。

id-sb 2020-01-22 07:35

测试一下 对以下内容的回复:

id-sb 2020-01-22 07:35

测试评论

1 共 10 条评论, 1 页