Rust Async 异步编程(五):执行器和系统 I/O

软件测试--用例篇(测试用例的好处、测试用例的七种设计方法、测试用例的粒度、测试用例的评价) 作为软件测试工程师,最主要的工作就是:编写测试用例,那么为什么要编写测试用例?它有什么好处?如何编写测试用例?测试用例写简单好还是复杂好?如何评价测试用例的质量? 天呐撸!能说不会吗?! 作为倾向软件测试工程师的老铁们,还是一起来学习吧! 一、编写测试用例的好处 测试用例是测试者的依据 测试用例使得工作可重复,是自动化测试的基础 补充:自动化测试的前提条件是:功能比较稳定,页面... 阅读详情

Rust Async 异步编程(五):执行器和系统 I/O

Rust Async 异步编程(五):执行器和系统 I/O

前面我们一起看过一个使用 Future 从 Socket 中异步读取数据的例子:

pub struct SocketRead<'a> {
    socket: &'a Socket,
}

impl SimpleFuture for SocketRead<'_> {
    type Output = Vec<u8>;

    fn poll(&mut self, wake: fn()) -> Poll<Self::Output> {
        if self.socket.has_data_to_read() {
            // socket 有数据,写入 buffer 中并返回
            Poll::Ready(self.socket.read_buf())
        } else { // socket 中还没数据
            // 注册一个 wake 函数,当数据可用时,该函数会被调用,
            // 然后当前 Future 的执行器会再次调用 poll 方法,此时就可以读取到数据
            self.socket.set_readable_callback(wake);
            Poll::Pending
        }
    }
}

该例子中,Future 将从 Socket 读取数据,若当前还没有数据,则会让出当前线程的所有权,允许执行器去执行其它的 Future。

当数据准备好后,会调用 wake() 函数将该 Future 的任务放入任务通道中,等待执行器的 poll。

关于该流程已经反复讲了很多次,相信大家应该非常清楚了。然而该例子中还有一个疑问没有解决:set_readable_callback 方法到底是怎么工作的?怎么才能知道 socket 中的数据已经可以被读取了?

在现实世界中,该问题往往是通过操作系统提供的 I/O 多路复用机制来完成,例如 Linux 中的 epoll,FreeBSD 和 macOS 中的 kqueue,Windows 中的 IOCP,Fuchisa中的 ports 等(可以通过 Rust 的跨平台包 mio 来使用它们)。借助 I/O 多路复用机制,可以实现一个线程同时阻塞地去等待多个异步 I/O 事件,一旦某个事件完成就立即退出阻塞并返回数据。

相关实现类似于以下代码:

struct IoBlocker { /* ... */ }

struct Event {
    // Event 的唯一 ID,该事件发生后,就会被监听起来
    id: usize,

    // 一组需要等待或者已发生的信号
    signals: Signals,
}

impl IoBlocker {
    /// 创建需要阻塞等待的异步 I/O 事件的集合
    fn new() -> Self { /* ... */ }

    /// 对指定的 I/O 事件表示兴趣
    fn add_io_event_interest(
        &self,

        /// 事件所绑定的 socket
        io_object: &IoObject,

        event: Event,
    ) { /* ... */ }

    /// 进入阻塞,直到某个事件出现
    fn block(&self) -> Event { /* ... */ }
}

let mut io_blocker = IoBlocker::new();
io_blocker.add_io_event_interest(
    &socket_1,
    Event { id: 1, signals: READABLE },
);
io_blocker.add_io_event_interest(
    &socket_2,
    Event { id: 2, signals: READABLE | WRITABLE },
);
let event = io_blocker.block();

// 当 socket 的数据可以读取时,打印 "Socket 1 is now READABLE" 
println!("Socket {:?} is now {:?}", event.id, event.signals);

Future 执行者可以使用这些 I/O 多路复用机制提供异步 I/O 对象,例如 socket,它就可以当特定 IO 事件发生时通过配置回调来运行

针对我们 SocketRead 例子,Socket::set_readable_callback 的伪代码大致如下:

impl Socket {
    fn set_readable_callback(&self, waker: Waker) {
        let local_executor = self.local_executor;
        let id = self.id;
        local_executor.event_map.insert(id, waker);
        local_executor.add_io_event_interest(
            &self.socket_file_descriptor,
            Event { id, signals: READABLE },
        );
    }
}

现在,我们就只有一个执行者线程,它可以接收 I/O 事件,并将它们分配到适合的 Waker,这将唤醒相应的任务,并允许执行者在返回检查更多的 I/O 事件之前,驱动更多的任务完成(循环继续…)。

这样,我们只需要一个执行器线程,它会接收 I/O 事件并将其分发到对应的 Waker 中,接着后者会唤醒相关的任务,最终通过执行器 poll 后,任务可以顺利的继续执行,这种 I/O 读取流程可以不停的循环,直到 socket 关闭。

参考:

  1. https://github.com/rustcn-org/async-book
  2. https://www.bilibili.com/video/BV1Ki4y1C7gj
【AI 赋能:Python 人工智能应用实战】16. BERT微调实战:中文新闻分类全流程(附模型蒸馏+ONNX部署完整代码) 中文新闻分类是NLP领域的经典实用任务,BERT模型凭借双向上下文建模能力,能有效解决中文歧义与长文本依赖问题,但存在推理速度慢、资源占用高的痛点。本文以THUCNews中文新闻数据集为核心,提供从数据预处理、BERT微调、模型蒸馏到生产部署的全流程实操指南。首先详解THUCNews的多编码读取与清洗(解决gbk/utf-8兼容问题);然后实现BERT微调,加入早停机制与混淆矩阵可视化,验证准确率达93.8%;接着用DistilBERT完成模型蒸馏,在仅损失0.6%准确率的前提下,将推理速度提升2.7倍。 阅读详情

相关推荐

Excel曲线拟合实战:从基础趋势线到高级回归分析

本文系统介绍了Excel曲线拟合的完整工作流,从基础的散点图与趋势线应用,到利用Solver插件进行自定义高级回归分析。文章详细讲解了线性、多项式、指数、对数等六大常用数学模型的适用场景与选择方法,并强调了通过R²值、残差图评估拟合效果、避免过拟合与外推风险的关键步骤,帮助读者掌握从数据探索到预测评估的实战技能。

weixin_29280219的博客 538

Rust异步编程 Async Await 入门

要了解什么是异步代码,我们首先来谈谈同步代码。println!println!上述语句按照明确的顺序执行,从上到下一个接一个地执行。” 打印,然后读取并打印Cargo.toml的内容。这种模式在正常操作下非常好 - 但有时代码需要在当前上下文在等待其他内容时暂停 - 这通常称为阻塞。换句话说,当一段代码被阻塞时,它实际上处于暂停状态,等待特定操作完成才能继续。例如,当等待文件系统、网络通信、数据库事务甚至一段时间过去时,就会发生这种情况。在此阻塞状态期间,程序保持空闲状态,无法同时执行其他任务。

xuejianxinokok的专栏 1657

飞塔防火墙认证绕过漏洞(CVE-2022-40684)深度剖析与实战复现

本文深度剖析了Fortinet飞塔防火墙高危认证绕过漏洞CVE-2022-40684的原理与影响。该漏洞允许攻击者通过构造包含特定Forwarded头和User-Agent的HTTP请求,无需凭证即可绕过认证,以管理员身份访问设备。文章详细演示了从环境搭建到实战复现,最终植入SSH密钥获取控制权的完整过程,并提供了漏洞挖掘技巧与关键防御建议。

d6e7f8g9h的博客 709

【Rust异步】async和await异步编程实战:高并发任务处理全解析

async 和 await 是 Rust 中用于异步编程的关键字。 async 用于定义异步函数,表示函数体中包含异步代码。 await 用于等待异步操作完成,并返回异步操作的结果。 • 异步函数使用 async 关键字定义,并返回实现了 Future Trait 的类型。 异步函数可以在其他异步函数中使用 await 关键字等待异步操作完成。 调用异步函数时,会返回一个实现了 Future Trait 的对象,可以通过调用.await 方法等待结果。

景天科技苑 2万+

vue高德地图POI关键字搜索定位

最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。

YL 2136

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4087

Rust异步编程之async与.await

介绍了Rust中异步编程基本语法async与.await和Future,以及常见的运行时

飞鹰技术 1098

【侯俊霞全网最全收集--PLC1200/200SMART(88+93课时) 第1章】

第1章:零基础快速入门西门子S7-1200

问就ycy的博客 2046

探索异步编程的艺术:Rust版《async-book》

在这个高并发、低延迟的时代,异步编程已成为开发高性能应用的必备技能。而Rust语言以其强大的安全性和性能,越来越受到开发者的青睐。今天,我们要向您推荐一个专为Rust爱好者打造的开源项目——[async-book](https://github.com/rust-lang/async-book)。这是一本详细阐述Rust中异步编程概念和技术的权威指南,旨在帮助开发者深入理解并掌握这一核心技术。 ...

gitblog_00038的博客 541

MySQL 高可用与集群技术深度解析

高可用性(High Availability,HA)是指系统在较长时间内持续提供服务的能力,通常以系统正常运行时间占总时间的百分比(如 “99.99% 可用性”)来衡量。对于数据库系统而言,高可用性目标是通过冗余设计、故障自动检测与恢复、负载均衡等技术手段,最大限度地减少因硬件故障、软件错误、网络问题等导致的服务中断,确保数据的高可靠性和业务的连续性。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1505

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 971

Rust Async 异步编程(十一):Async 生态

Rust Async 异步编程(十一):Async 生态

ProgramNovice的博客 1009

Qt —— 在Win11下“Qt for Android“开发环境,通过USB在真机(华为Meta60 PRO)上调试运行,并打包APK并在真实手机运行

Qt —— 在Win11下“Qt for Android“开发环境,打包APK并在真实手机运行

315

【跟小嘉学 Rust 编程】二十七、Rust 异步编程(Asynchronous Programming)

本章节讲解 Rust 的异步编程方案,我们将讲解 Future、Waker、Executor、Pin、async 和 await、Stream等主要教材参考 《The Rust Programming Language》主要教材参考 《Rust For Rustaceans》主要教材参考 《The Rustonomicon》主要教材参考 《Rust 高级编程》主要教材参考 《Cargo 指南》主要教材参考 《Rust 异步编程》并发是程序同时有多个正在运行的线程。

小嘉丶学长的博客 3243

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Rust 异步编程深入浅出指南

Rust异步编程解析:Rust通过Future、async/await和执行器(如tokio)实现高效异步编程,适用于高并发场景。核心机制包括Waker通知系统、异步I/O和轻量级任务调度,并发模式提供select!、异步锁和流处理工具。开发需注意避免阻塞操作、限制并发数,并遵循结构化并发原则。调试时可使用异步堆栈追踪和监控工具,常见陷阱包括任务阻塞和Future未推进问题。Rust的异步模型兼具安全性与高性能,是构建现代网络服务的理想选择。

萧曳丶 1124

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RustTraining 异步编程开篇:为什么 Rust 的 async/await 与其他语言截然不同

> **导读**:本文基于 RustTraining 仓库中的 [async-book](https://link.gitcode.com/i/0bf887ca0e9f7eafbea40390cc1ed29d) 第一章,系统讲解 Rust 异步模型最根本的差异——**Rust 没有内置异步运行时**,`async fn` 只是把函数编译成实现 `Future` trait 的状态机,需要由第三方执

gitblog_00094的博客 449

Comprehensive Rust 教程:Rust 异步编程的四大陷阱(阻塞执行器、Pin、Async Traits 与取消安全)

异步编程(`async`/`await`)为并发编程提供了便捷而高效的抽象,但 Rust 的 async/await 模型也自带一系列陷阱与"脚枪"(footguns)。本指南以 Google Android 团队维护的 Rust 课程 [Comprehensive Rust](https://link.gitcode.com/i/6d746f3ecc4b96f11f761b8c065c3dde)

gitblog_00915的博客 341

comprehensive-rust 课程解读:Rust Async 异步编程基础——Futures、async/await、任务与运行时

> 本文基于 Google Android 团队维护的 Rust 培训课程 [comprehensive-rust](https://link.gitcode.com/i/0a832b9543e51ae71de28fbd00aa78f4) 中 Concurrency(并发)模块的 "Async Basics" 章节撰写。该章节的入口文档为 [src/concurrency/async.md](ht

gitblog_00497的博客 410

Rust 异步编程基础

本文意在作为对前两章的导读,希望能帮助读者理解 Rust 异步编程的底层逻辑。读者应该先坚持着把 Rust 异步编程圣经的前两章读上两三遍,不必做到理解,但至少先熟悉它说了什么,再带着问题回来看这个导读。

Vallelonga的博客 1483

async-std 与标准库对比:理解异步编程的优势与挑战

在当今高性能网络应用的时代,异步编程已成为现代软件开发的核心技能。async-std 作为 Rust 标准库的异步版本,为开发者提供了熟悉且强大的异步编程工具集。本文将深入探讨 async-std 与标准库的关键差异,帮助您全面理解异步编程的独特价值与实现挑战。🚀 ## 什么是 async-std?异步编程的完整解决方案 async-std 是一个旨在提供与 Rust 标准库完全对应的异步版

gitblog_00270的博客 968

Rust Async 异步编程(五):async/.await

Rust Async 异步编程(五):async/.await

ProgramNovice的博客 1455

Glommio入门指南:5分钟学会Rust异步编程新范式

Glommio是一个基于`io_uring`的Rust协程线程每核(Cooperative Thread-per-Core)框架,专为Linux系统设计。它允许开发者编写高效的异步代码,充分利用Rust的`async`/`await`语法,且不依赖任何辅助线程,为高性能并行应用提供了全新的解决方案。 ## 什么是Glommio? Glommio(发音为glo-mee-jow或|glomjəʊ|

gitblog_00969的博客 958

2.7 Future 和异步编程基础:从 Promise 到 Rust Future,理解异步的本质

本文介绍了异步编程的核心概念,重点对比了Rust的Future和JavaScript的Promise。主要内容包括: 同步编程的局限性:线程资源开销大、上下文切换成本高、I/O阻塞问题 异步编程模型:通过非阻塞方式实现高效I/O操作,单个线程可管理大量并发任务 Future的核心机制: 惰性求值(与JavaScript Promise的立即执行不同) poll方法实现"挂起-唤醒"机制 执行器循环调度任务的工作流程 手动实现TimerFuture示例: 演示了Future的基本结构 展示

yonggeit的博客 2777

2.8 Async Await 实战:Rust 异步编程完整指南,写出高性能异步代码

本文介绍了Rust异步编程的核心概念和实践方法。主要内容包括: 异步运行时(Runtime)的作用和主流选择,重点介绍了tokio运行时及其组件(执行器、反应器、定时器) async/await语法详解: async fn创建Future tokio::main宏启动运行时 .await机制解析(非阻塞等待) 并发执行Future的方法: tokio::spawn创建并发任务 join!和try_join!宏并发等待多个Future 实战案例:构建并发的TCP Echo服务器,展示异步I/O操作 文章通过具

yonggeit的博客 2863

Rust 异步编程速查手册:async-book 总结与参考卡深度解析

本手册以 RustTraining 仓库中 [async-book](https://link.gitcode.com/i/b3d4eafc5123b1c3fb3a7ec36f97a54b) 的收尾章节《Summary and Reference Card》为骨架,将全套异步学习材料浓缩成一份可直接查阅、可复制运行的技术速查卡:从 `async fn → Future` 的心智模型,到 `join

gitblog_00265的博客 1100

blog_os异步编程实战:用async/await构建高性能内核

在现代操作系统开发中,异步编程已成为构建高性能、响应式系统的核心技术。传统的同步阻塞模型在面对I/O密集型操作时往往导致CPU资源浪费和系统响应延迟。而异步编程通过非阻塞的方式处理I/O操作,能够在等待硬件响应的同时执行其他任务,显著提升系统吞吐量。 blog_os作为一个用Rust编写的教学操作系统,深刻体现了异步编程在现代系统设计中的价值。通过async/await语法和Future tra...

gitblog_00726的博客 633

Rust async/await 的状态机实现:从 Future Trait 到零开销异步的秘密

Rust 的 async/await 通过对编译器的深度利用,实现了异步编程中的"零成本抽象"。Future 状态机的每字节开销都由开发者显式控制,不做任何隐式的堆分配。I/O 密集型高并发服务:Rust async 的内存效率优势显著;CPU 密集型任务:使用 Rayon 等线程池模型,async 无额外收益;团队 Rust 经验不足:Go 的 Goroutine 模型的学习曲线远低于 Rust async。

iymei4986533030的博客 4592
上一篇: Rust Async 异步编程(一):入门
下一篇: Rust Async 异步编程(二):Future trait
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值