Rust 程序设计(第 2 版)
Jim Blandy, Jason Orendorff, Leonora F. S. Tindall
软件工程师
1469 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
课程目录
已完结/共 41 讲
时长 02:41
时长 06:30
时长 10:04
时长 01:05
时长 50:06
时长 31:35
时长 34:39
时长 29:11
时长 37:15
时长 23:44
时长 44:19
时长 29:54
时长 39:01
时长 01:38
时长 01:15
时长 00:37
Rust 程序设计(第 2 版)
15
15
1.0x
00:00/00:00
登录|注册

第 20 章 异步编程(1)

假设你要编写一个聊天服务器。对于每个网络连接,都会有一些要解析的传入数据包、要组装的传出数据包、要管理的安全参数、要跟踪的聊天组订阅等。要想同时管理这么多连接,就得进行一定的组织工作。
理论上,可以为传入的每个连接启动一个单独的线程:
use std::;
let listener = net::TcpListener::bind(address)?;
for socket_result in listener.incoming() {
let socket = socket_result?;
let groups = chat_group_table.clone();
thread::spawn(|| {
log_error(serve(socket, groups));
});
}
对于每个新连接,这都会启动一个运行 serve 函数的新线程,此线程专注于管理单个连接所需的一切。
这确实很好,好得远远超出了预期,直到有一天突然涌入了数万个用户。每个线程都拥有 100 KiB 以上的栈,这很常见,但这可不是你花费数 GB 服务器内存的理由。如果要在多个处理器之间分配工作,那么线程固然好用,而且确有必要。但现在它们的内存需求已经太大了,所以通常在使用线程的同时,还要用一些补充手段来完成这些工作。
可以使用 Rust 异步任务在单个线程或工作线程池中交替执行许多彼此独立的活动。异步任务类似于线程,但其创建速度更快,在它们之间可以更有效地传递控制权,并且其内存开销比线程少一个数量级。在单个程序中同时运行数十万个异步任务是完全可行的。当然,你的应用程序可能仍会受到其他因素的制约,比如网络带宽、数据库速度、算力,或此工作的固有内存需求,但与线程的开销相比,这些异步任务的固有内存开销只是九牛一毛。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust 异步编程是本文的核心主题,通过对比传统的多线程模型和异步任务模型的优劣势,详细介绍了异步编程的核心概念,包括 Future、异步函数、await 表达式、任务以及执行器等。文章还讨论了同步操作的阻塞特性以及如何通过引入 Future 来实现异步操作。此外,还介绍了异步版本的 read_to_string 函数的实现方式,并介绍了异步编程的“皮纳塔模型”。通过实际案例和技术概念的介绍,读者可以了解异步编程在 Rust 中的基本原理和应用场景。文章内容涵盖了异步函数与 await 表达式的使用,以及异步编程的工作原理,对于想要深入了解 Rust 异步编程的读者具有一定的参考价值。同时,文章还介绍了如何从同步代码调用异步函数以及启动异步任务的方法,为读者提供了全面的异步编程知识。文章还介绍了异步编程中的一些技术细节,如异步函数的 Future 实现需要符合 Send 要求,以及如何处理非 Send 类型的情况。文章还对 Rust 的异步编程方式与其他语言的异步设计进行了比较,突出了 Rust 的独特之处。同时,还展示了一个真正的异步 HTTP 客户端的例子,为读者提供了实际的应用场景。文章内容丰富,涵盖了异步编程的基本原理和实际应用,适合对 Rust 异步编程感兴趣的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部