Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Rust async、Future、JoinHandle的区别

Rust async、Future、JoinHandle的区别

原创
作者头像
路之遥
发布于 2025-04-10 02:46:58
发布于 2025-04-10 02:46:58
820
举报
文章被收录于专栏:luzhiyaoluzhiyao

在rust 的异步项目中,经常看到用async、JoinHandle修饰的函数/方法,它们二者在异步开发中有什么区别,什么时候用async,什么时候用JoinHandle.

async与Future

async 是rust Future的语法糖,主要用于定义 异步函数或异步代码块,编译器会将async 代码块在编译期生成对应的Future实现代码,它是lazy的不会自动执行任务,需要await才会触发函数或代码块运行。

下面2个do_something_**的定义本质上是做同一件事情,

代码语言:rust
AI代码解释
复制
use std::future::Future;

async fn do_something_async() -> u64 {
    32
}

fn do_something_future() -> impl Future<Output = u64> {
    async { 32 }
}

#[tokio::main]
async fn main() {
    println!("{}", do_something_async().await);
    println!("{}", do_something_future().await);
}

async 主要用于定义 异步函数 或 异步代码块,它不会自动启动任务,而是返回一个 Future,需要 await 运行。

JoinHandle

JoinHandle 是一个“等待某个任务执行完成并获得其结果”的句柄(Handle),创建后会线程内任务会立即执行、非lazy,当需要获取线程内任务执行结果时调用.join或.await。

标准库(std::thread)与异步运行时库(如 tokio)都提供了JoinHandle的语义,它们具有相同的执行语义:非lazy,获取内部异步任务结果时分别使用.join、.await。

代码语言:rust
AI代码解释
复制
fn main() {
    thread_join();
    async_runtime_join();
}

fn thread_join() {
    let begin = std::time::Instant::now();
    let handler = std::thread::spawn(|| (std::time::Instant::now(), "hello world".to_string()));
    std::thread::sleep(std::time::Duration::from_secs(2));
    let result = handler.join().unwrap();
    let end = std::time::Instant::now();
    assert_eq!(result.1, "hello world");
    println!(
        "begin: {:?}, thread completed {:?}, end: {:?}",
        begin.elapsed().as_secs(),
        result.0.elapsed().as_secs(),
        end.elapsed().as_secs()
    );
}

fn async_runtime_join() {
    let rt = tokio::runtime::Runtime::new().unwrap();
    rt.block_on(async {
        let begin = std::time::Instant::now();
        let handler =
            tokio::spawn(async { (std::time::Instant::now(), "hello world".to_string()) });
        tokio::time::sleep(std::time::Duration::from_secs(2)).await;
        let result = handler.await.unwrap();
        let end = std::time::Instant::now();
        assert_eq!(result.1, "hello world");
        println!(
            "begin: {:?}, async thread completed {:?}, end: {:?}",
            begin.elapsed().as_secs(),
            result.0.elapsed().as_secs(),
            end.elapsed().as_secs()
        );
    })
}

总结

概念

作用

是否立即执行

如何获取结果

async

构建 Future

❌ 不会

需要 .await

Future

异步操作描述符

❌ 不会

.await

JoinHandle

表示一个异步任务的运行句柄

✅ 会执行

.await 结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust异步编程之Future初探
Rust的Future是用来实现异步编程的。今天我们围绕其了解下Rust的异步编程是如何构建。
newbmiao
2024/01/10
6200
Rust异步编程之Future初探
Rust中的异步编程实战:使用Tokio构建并发应用
异步编程是一种重要的编程模型,允许我们以非阻塞的方式执行I/O密集型操作,显著提高程序的性能。Rust中的异步编程模型非常强大,特别是与tokio等异步运行时结合使用时,能够让我们高效地构建并发应用。
数字扫地僧
2024/12/14
3970
【Rust每周一库】smol - 异步rumtime
smol是一个轻量而高效的异步runtime。它采用了对标准库进行扩展的方式,整个runtime只有大约1500行代码。作者stjepang大神是大名鼎鼎crossbeam的作者。而他之前参与tokio和async-std的开发的经验和思考,产生出了从头开始构建的smol这个库。实际上在达到和tokio以及async-std相似的性能的前提下,smol代码短线精悍,完全没有依赖mio库,API更加简单,并且没有unsafe代码!而且,它还兼容tokio和async-std。让我们看个简单的例子
MikeLoveRust
2020/05/14
1.2K0
rust多线程
在rust中,多线程编程不算困难,但是也需要留心和别的编程语言中不同的地方。rust的标准库中提供的thread库来帮助我们进行多线程编程。在使用的时候需要使用use std::thread来引入thread库即可。
zy010101
2023/05/28
1K0
【原创】Rust tokio 如何以异步非阻塞方式运行大量任务
tokio 官方给了一个完整的例子:手动构建 runtime ,利用 block_on 来运行多个任务。tokio 的任务是由 tokio::spawn 之类的函数产生的 JoinHandle 类型,而且是个 Future 。
MikeLoveRust
2021/09/08
5.1K0
【大家的项目】可 Deferred 就绪的 Future 实现类
改变当前Future对象的Polling状态从Poll::Pending至Poll::Ready<T>。这个痛点是futures crate都没有照顾到的。
MikeLoveRust
2023/10/30
2860
【大家的项目】可 Deferred 就绪的 Future 实现类
Rust常用并发示例代码
如果method1()被多次调用,就会创建多个线程,如果希望不管调用多少次,只能有1个线程,在不使用线程池的前提下,有1个简单的办法:
菩提树下的杨过
2022/09/28
1K0
Rust常用并发示例代码
Rust语法之多线程(Tokio)
该示例代码创建了一个包含 9 个元素的 Vec,然后使用 Arc 和 Mutex 包装了该 Vec。接着,我们创建了 3 个线程,每个线程负责修改 Vec 的三分之一元素的值。在每个线程的执行体中,我们使用 Mutex 来获取 Vec 的写锁,并修改 Vec 中的元素。最后,我们等待所有线程完成,并输出修改后的 Vec。
码客说
2023/04/17
1.9K0
Rust异步编程之Future并发处理
上篇文章我们知道,Rust的Future是异步执行,await时是阻塞在当前的异步任务task上,直到完成。
newbmiao
2024/01/11
5200
Rust异步编程之Future并发处理
Rust 中的 QUIC 实现 --- quinn
QUIC 是基于 UDP 的多路复用、安全传输协议。可以简单理解为在用户空间将 TCP 里的机制实现了一遍,比如拥塞控制、流量控制等。好处是升级比较方便,TCP 协议栈是内核中实现的,只能随内核升级,而 QUIC 可灵活升级。
谛听
2022/01/30
4.2K0
Rust 异步编程笔记
Future 代表一个异步计算,它会产生一个值。通过调用 poll 方法来推进 Future 的运行,如果 Future 完成了,它将返回 Poll::Ready(result),我们拿到运算结果。如果 Future 还不能完成,可能是因为需要等待其他资源,它返回 Poll::Pending。等条件具备,如资源已经准备好,这个 Future 将被唤醒,再次进入 poll,直到计算完成获得结果。
mazhen
2023/11/24
4440
Rust 异步编程笔记
tokio之如何观测Rust异步任务的调度
通过之前的《Rust 异步编程之 Future 初探》我们知道Rust的异步是以task的调度来构建的。task作为抽象在语言层面的调度单元。
newbmiao
2024/02/26
5160
tokio之如何观测Rust异步任务的调度
【Rust日报】2019-12-19 Writing BPF code in Rust
Includes new APIs, utilities, and fixes. Some highlights:
MikeLoveRust
2019/12/25
6630
【Rust日报】2019-12-19 Writing BPF code in Rust
Rust高并发编程总结
Serverless的概念火了,业界已经不再讨论要不要用Serverless的问题了,而是高喊Serverless First的口号力求快速拥抱Serverless,无服务器并不是Serverless的本质,不需要关心服务器的情况就能高效工作,才是Serverless胜出的核心要义。互联网时代流量的大起大落,很多科技巨头在面对流量的冲击时也都败下阵来,针对前几个月B站的崩溃事件,笔者还曾写过《B站的前端崩了,后端的你别慌》来分析来龙去脉,而Serverless凭借快速伸缩的自动弹性特点,可以从容应对类似的冲击,这也让这种新技术出尽的风头。
beyondma
2021/10/01
1.3K0
TOKIO ASYNC&AWAIT 初探
rust的async/await终于在万众瞩目之下稳定下来了,一起来尝尝鲜. 这篇文章主要是介绍基于tokio 0.2做一个服务程序员的小工具githubdns.
MikeLoveRust
2019/12/17
1.4K0
【翻译】200行代码讲透RUST FUTURES (7)
我们将用一个伪reactor和一个简单的执行器创建我们自己的Futures,它允许你在浏览器中编辑和运行代码
MikeLoveRust
2020/08/05
1.3K0
【Rust日报】2023-09-13 RustRover – JetBrains 推出的独立 Rust IDE
“什么时候会有 Rust IDE?” 这是用户经常提出的问题(八年了,你知道这八年我怎么过的吗?),现在,JetBrains 宣布这一天已经到来:它就是 JetBrains 独立 Rust IDE – RustRover。
MikeLoveRust
2023/09/26
4530
【Rust日报】2023-09-13 RustRover – JetBrains 推出的独立 Rust IDE
Rust网络编程框架-Tokio进阶
我们在上文《小朋友也能听懂的Rust网络编程框架知识-Tokio基础篇》对于Tokio的基础知识进行了一下初步的介绍,本文就对于Tokio的用法及原理进行进一步的介绍与说明。
beyondma
2021/09/19
2.6K0
TiKV 源码阅读三部曲(一)重要模块
作者简介:谭新宇,清华大学软件学院研三在读,Apache IoTDB committer,Talent Plan Community mentor。
PingCAP
2022/10/18
9150
浅谈Rust和Golang协程设计
根据维基百科的定义,协程,是指在非抢占式地处理多任务场景下,用于生成子程序的计算机程序组件,它允许在执行过程中被暂停或恢复。
云云众生
2020/12/04
8.1K1
浅谈Rust和Golang协程设计
相关推荐
Rust异步编程之Future初探
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档