< 返回版块

kaixinbaba 发表于 2020-12-18 14:17

Tags:async,await

use tokio::net::TcpListener;
use tokio::prelude::*;

async fn foo() -> Result<i8, String> {
    println!("foo");
    Ok(8)
}

#[tokio::main]
async fn main() -> Result<(), String> {
    let f = foo();

    println!("in main after foo");
    println!("result: {}", f.await.unwrap());

    Ok(())
}

昨天刚接触异步编程,这里的foo函数是异步的,虽然一开始就调用了,但是我等到in main after foo之后再用await触发。 我的疑问是,如果代码改成这样(同步版本):

use tokio::net::TcpListener;
use tokio::prelude::*;

fn foo() -> Result<i8, String> {
    println!("foo");
    Ok(8)
}

#[tokio::main]
async fn main() -> Result<(), String> {

    println!("in main after foo");
    let f = foo();
    println!("result: {}", f.unwrap());

    Ok(())
}

有什么区别? 其实想问的就是异步编程的最终意义是什么,我把异步代码延迟执行延迟执行同步代码两者有啥区别? 以前从来没接触过异步编程,包括在Python或者JavaScript上也一样,新手求问

评论区

写评论
作者 kaixinbaba 2020-12-18 18:19

谢谢

--
👇
lithbitren: 在没有io以及休眠的情况下没啥区别,甚至协程异步还有额外开销。有io或时停时需要异步操作时,协程事件循环可以更好的利用空闲的cpu,省去了搞多线程或多进程这种系统级大开销的操作。

作者 kaixinbaba 2020-12-18 18:19

谢谢,我再捋捋

--
👇
xin-water: 等待的时间是不可避免的,区别是:同步代码会线程阻塞,傻等2秒,异步代码这2秒会去执行其他任务,不阻塞线程。 另外,负责资源具体加载的是操作系统,那是线程之外的东西。

xin-water 2020-12-18 18:01

等待的时间是不可避免的,区别是:同步代码会线程阻塞,傻等2秒,异步代码这2秒会去执行其他任务,不阻塞线程。 另外,负责资源具体加载的是操作系统,那是线程之外的东西。

--
👇
kaixinbaba: 就以大佬的举例我再次提问: 假设我现在请求一个url地址,服务器返回需要 2 秒,我如果是同步的函数的话会在此等 2 秒。 但是如果我把这个函数变成异步的,我在调用 await 的时候才算真正触发此函数,不也需要等待 2 秒吗? 我一直困惑的地方就是这里,这个 2 秒的时间异步是怎么规避掉的呢? 谢谢您的回复

--
👇
xin-water: rust官方异步教程里第一章内容就是。 简单说就是节省时间。 如: 同步代码中响应网络请求,等待网络数据需要几百毫秒时间,然后再分析请求并生成响应;

如果用异步,发现需要等待就先执行其他异步任务,等前一个任务需要的数据接收完毕后再来执行请求处理;这样一个异步任务就会节省几百毫秒时间,几十万个异步任务节省的时间就更多了,同时用一个线程就能处理几十万种不同任务,比多线程并发这种开几十万个线程来处理这些任务节省资源。

lithbitren 2020-12-18 17:13

在没有io以及休眠的情况下没啥区别,甚至协程异步还有额外开销。有io或时停时需要异步操作时,协程事件循环可以更好的利用空闲的cpu,省去了搞多线程或多进程这种系统级大开销的操作。

作者 kaixinbaba 2020-12-18 17:09

就以大佬的举例我再次提问: 假设我现在请求一个url地址,服务器返回需要 2 秒,我如果是同步的函数的话会在此等 2 秒。 但是如果我把这个函数变成异步的,我在调用 await 的时候才算真正触发此函数,不也需要等待 2 秒吗? 我一直困惑的地方就是这里,这个 2 秒的时间异步是怎么规避掉的呢? 谢谢您的回复

--
👇
xin-water: rust官方异步教程里第一章内容就是。 简单说就是节省时间。 如: 同步代码中响应网络请求,等待网络数据需要几百毫秒时间,然后再分析请求并生成响应;

如果用异步,发现需要等待就先执行其他异步任务,等前一个任务需要的数据接收完毕后再来执行请求处理;这样一个异步任务就会节省几百毫秒时间,几十万个异步任务节省的时间就更多了,同时用一个线程就能处理几十万种不同任务,比多线程并发这种开几十万个线程来处理这些任务节省资源。

yuchunzhou 2020-12-18 16:03

其实,也就是充分利用空转的cpu时钟周期。

xin-water 2020-12-18 14:43

rust官方异步教程里第一章内容就是。 简单说就是节省时间。 如: 同步代码中响应网络请求,等待网络数据需要几百毫秒时间,然后再分析请求并生成响应;

如果用异步,发现需要等待就先执行其他异步任务,等前一个任务需要的数据接收完毕后再来执行请求处理;这样一个异步任务就会节省几百毫秒时间,几十万个异步任务节省的时间就更多了,同时用一个线程就能处理几十万种不同任务,比多线程并发这种开几十万个线程来处理这些任务节省资源。

1 共 7 条评论, 1 页