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
上也一样,新手求问
1
共 7 条评论, 1 页
评论区
写评论谢谢
--
👇
lithbitren: 在没有io以及休眠的情况下没啥区别,甚至协程异步还有额外开销。有io或时停时需要异步操作时,协程事件循环可以更好的利用空闲的cpu,省去了搞多线程或多进程这种系统级大开销的操作。
谢谢,我再捋捋
--
👇
xin-water: 等待的时间是不可避免的,区别是:同步代码会线程阻塞,傻等2秒,异步代码这2秒会去执行其他任务,不阻塞线程。 另外,负责资源具体加载的是操作系统,那是线程之外的东西。
等待的时间是不可避免的,区别是:同步代码会线程阻塞,傻等2秒,异步代码这2秒会去执行其他任务,不阻塞线程。 另外,负责资源具体加载的是操作系统,那是线程之外的东西。
--
👇
kaixinbaba: 就以大佬的举例我再次提问: 假设我现在请求一个url地址,服务器返回需要 2 秒,我如果是同步的函数的话会在此等 2 秒。 但是如果我把这个函数变成异步的,我在调用
await
的时候才算真正触发此函数,不也需要等待 2 秒吗? 我一直困惑的地方就是这里,这个 2 秒的时间异步是怎么规避掉的呢? 谢谢您的回复--
👇
xin-water: rust官方异步教程里第一章内容就是。 简单说就是节省时间。 如: 同步代码中响应网络请求,等待网络数据需要几百毫秒时间,然后再分析请求并生成响应;
如果用异步,发现需要等待就先执行其他异步任务,等前一个任务需要的数据接收完毕后再来执行请求处理;这样一个异步任务就会节省几百毫秒时间,几十万个异步任务节省的时间就更多了,同时用一个线程就能处理几十万种不同任务,比多线程并发这种开几十万个线程来处理这些任务节省资源。
在没有io以及休眠的情况下没啥区别,甚至协程异步还有额外开销。有io或时停时需要异步操作时,协程事件循环可以更好的利用空闲的cpu,省去了搞多线程或多进程这种系统级大开销的操作。
就以大佬的举例我再次提问: 假设我现在请求一个url地址,服务器返回需要 2 秒,我如果是同步的函数的话会在此等 2 秒。 但是如果我把这个函数变成异步的,我在调用
await
的时候才算真正触发此函数,不也需要等待 2 秒吗? 我一直困惑的地方就是这里,这个 2 秒的时间异步是怎么规避掉的呢? 谢谢您的回复--
👇
xin-water: rust官方异步教程里第一章内容就是。 简单说就是节省时间。 如: 同步代码中响应网络请求,等待网络数据需要几百毫秒时间,然后再分析请求并生成响应;
如果用异步,发现需要等待就先执行其他异步任务,等前一个任务需要的数据接收完毕后再来执行请求处理;这样一个异步任务就会节省几百毫秒时间,几十万个异步任务节省的时间就更多了,同时用一个线程就能处理几十万种不同任务,比多线程并发这种开几十万个线程来处理这些任务节省资源。
其实,也就是充分利用空转的cpu时钟周期。
rust官方异步教程里第一章内容就是。 简单说就是节省时间。 如: 同步代码中响应网络请求,等待网络数据需要几百毫秒时间,然后再分析请求并生成响应;
如果用异步,发现需要等待就先执行其他异步任务,等前一个任务需要的数据接收完毕后再来执行请求处理;这样一个异步任务就会节省几百毫秒时间,几十万个异步任务节省的时间就更多了,同时用一个线程就能处理几十万种不同任务,比多线程并发这种开几十万个线程来处理这些任务节省资源。