从入门到实践:Rust 异步编程完全指南

【Rust异步编程】Rust异步编程原理解析、标准库实现与第三方库实现详解 异步编程是一种允许程序在等待某些操作(如I/O)完成时继续执行其他任务的编程范式。与传统的同步编程相比,异步编程可以显著提高程序的吞吐量和资源利用率。 在Rust中,异步编程具有以下特点: 非阻塞执行:任务可以在等待时让出控制权 轻量级:异步任务(称为future)比线程更轻量 显式标记:使用async/await语法明确标识异步代码 阅读详情

从入门到实践:Rust 异步编程完全指南

在高并发、IO 密集型场景中,异步编程已成为提升程序吞吐量的核心手段。与其他语言的异步实现不同,Rust 异步编程以零成本抽象为核心设计理念,结合其所有权与生命周期机制,实现了高性能与内存安全的兼顾。本文将从基础概念出发,逐步深入 Rust 异步的底层原理、实操技巧,并结合主流框架 Tokio 给出实战案例。

为什么需要异步编程?

在讨论异步之前,我们先回顾传统并发方案的痛点。并发方案的发展经历了多进程 -> 多线程、协程/异步的演进,其中多线程是常用于实现并发的方案,但存在着明显局限:

  • 线程开销高:每个线程都需要独立的栈空间,通常为 MB 级,大量线程会占用过多内存,且线程切换需操作系统内核调度,开销较大;
  • 资源利用率低:在 IO 密集型场景中,线程大部分时间处于阻塞等待状态,CPU 利用率低下;
  • 上下文切换频繁:高并发场景下,大量线程的切换会消耗大量 CPU 资源,导致程序性能下降。

Rust 异步编程基于无栈协程模型,无需操作系统内核调度,由用户态的运行时(Runtime)负责任务调度,能在单个线程中高效处理成千上万的并发任务,完美解决了上述痛点。其优势在于:低开销(协程栈为 KB 级,可创建海量任务)、高并发(减少内核级上下文切换)、内存安全(借助 Rust 所有权机制,避免数据竞争)。

概念解析

Future:异步任务的抽象

Future 是 Rust 异步编程的基石,它代表一个“未来可能完成的异步计算”,本质上是一个状态机。与其他语言的 Promise 类似,但 Rust 的 Future 具有惰性,即创建 Future 不会立即执行,只有被轮询(Poll)时才会推进执行。

标准库中 Future 特征的定义如下(简化版):

pub trait Future {
    // 异步计算产生的输出类型
    type Output;

    // 尝试在当前时间点完成 Future,返回 Poll 结果
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

// 轮询结果的枚举
pub enum Poll<T> {
    Ready(T), // 已完成,包含输出结果
    Pending,  // 尚未完成,需要稍后再次 poll
}

这其中:

  • Pin:用于固定 Future 在内存中的位置,防止其被移动,解决异步任务中“自引用结构体”的悬垂指针问题。由于编译器生成的 Future 状态机可能包含自引用指针,Pin 通过类型系统保证 Future 在轮询期间内存位置不变,确保安全。
  • Context 与 Waker:Context 是连接 Future 与执行器(Executor)的桥梁,内部包含一个 Waker 实例。当 Future 返回 Pending 时,会通过 Waker 注册唤醒条件;当条件满足时,Waker 的 wake() 方法会通知执行器,让 Future 再次被轮询。

async/await:异步语法糖

手动实现 Future 特征过于繁琐,Rust 提供了 async/await 语法糖,让开发者可以像编写同步代码一样编写异步代码,编译器会自动将 async 函数转换为实现了 Future 特征的状态机。

// async 函数返回一个 Future,无需手动实现 Future 特征
async fn async_task() -> String {
    // await 用于等待另一个 Future 完成,暂停当前任务,不阻塞线程
    let result = fetch_data().await;
    format!("处理结果:{}", result)
}

// 普通函数无法直接调用 await,需在 async 上下文使用
async fn main_async() {
    let result = async_task().await;
    println!("{}", result);
}

执行器(Executor)与反应器(Reactor)

Rust标准库仅定义了 Future 等核心抽象,并未提供完整的异步运行时,因此需要第三方运行时,比如 Tokio、async-std 来调度 Future 的执行。运行时的核心由两部分组成:Executor(执行器)和Reactor(反应器),二者协同工作实现异步任务的调度与唤醒,遵循 Reactor Pattern 模式。

  • Executor(执行器):负责管理和调度 Future 任务,维护两个队列,就绪任务队列(ready queue)和阻塞任务队列(wait queue)。它循环轮询就绪队列中的 Future,若 Future 返回 Ready 则完成任务,若返回 Pending 则将其转移到 Reactor 等待唤醒。主流执行器(如 Tokio)采用工作窃取(work-stealing)调度机制,多个线程间可共享任务,提升资源利用率。
  • Reactor(反应器):负责监听 IO 事件,比如网络连接、文件读写,基于操作系统的多路复用 API(如 epoll、kqueue、IOCP)进行封装。当 IO 事件就绪时,Reactor 会调用对应 Future 的 Waker.wake() 方法,将其重新放回 Executor 的就绪队列,等待再次轮询。

实战:基于Tokio的异步编程实践

Tokio 是 Rust 当下最流行的异步运行时,功能完整、性能优异,支持多线程调度、异步 IO、定时器等核心功能,是开发异步应用的首选框架。

环境搭建

在 Cargo.toml 中添加 Tokio 依赖,一般按需启用功能就好了,为了方便演示,我直接开启全部功能:

[dependencies]
tokio = { version = "1", features = ["full"] }

基础案例:异步定时器与多任务并发

实现多个异步任务并发执行,通过定时器模拟 IO 等待:

use tokio::task;
use tokio::time::{Duration, sleep};

// 异步任务1:延迟1秒后输出
async fn task1() {
    sleep(Duration::from_secs(1)).await;
    println!("任务1执行完成");
}

// 异步任务2:延迟2秒后输出
async fn task2() {
    sleep(Duration::from_secs(2)).await;
    println!("任务2执行完成");
}

// tokio::main 宏:创建多线程异步运行时,并执行 async main 函数
#[tokio::main]
async fn main() {
    // 方式1:使用 tokio::spawn 创建独立任务,并发执行
    let handle1 = task::spawn(task1());
    let handle2 = task::spawn(task2());

    // 等待所有任务完成,这里直接 unwrap() 是为了简化示例,实际使用中应处理可能的错误
    handle1.await.unwrap();
    handle2.await.unwrap();

    // 方式2:使用 join! 宏,并发等待多个 Future 完成,无返回值
    tokio::join!(task1(), task2());

    println!("所有任务执行完毕");
}

进阶案例:异步网络服务

实现一个简单的异步 TCP 服务器,处理客户端连接并返回响应,展示异步 IO 的核心用法:

use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::{TcpListener, TcpStream};

// 处理单个客户端连接
async fn handle_client(mut stream: TcpStream) {
    let mut buf = [0; 1024];
    // 异步读取客户端数据(非阻塞)
    let n = stream.read(&mut buf).await.unwrap();
    println!("收到客户端数据:{}", String::from_utf8_lossy(&buf[..n]));

    // 异步向客户端写入响应
    let response = "已收到你的消息,谢谢!\n";
    stream.write_all(response.as_bytes()).await.unwrap();
    stream.flush().await.unwrap();
    println!("已向客户端发送响应");
}

#[tokio::main]
async fn main() {
    // 绑定地址并监听TCP连接
    let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap();
    println!("TCP服务器已启动,监听地址:127.0.0.1:8080");

    // 循环接收客户端连接(异步阻塞,不占用CPU)
    loop {
        // 等待客户端连接,返回(连接流,客户端地址)
        let (stream, addr) = listener.accept().await.unwrap();
        println!("新客户端连接:{}", addr);

        // 启动新任务处理客户端,避免阻塞主线程
        tokio::spawn(handle_client(stream));
    }
}

启动服务后可进行测试,使用 telnet 连接127.0.0.1:8080,发送消息即可收到服务器响应。

处理阻塞操作

异步运行时的线程是工作线程,若在 async 函数中执行同步阻塞操作,会阻塞整个工作线程,导致其他异步任务无法执行。Tokio 提供了 spawn_blocking 方法,将阻塞操作放入专门的阻塞线程池执行,避免影响异步任务调度。

use std::fs;
use tokio::task;

// 同步阻塞操作:读取文件,耗时操作
fn read_file_sync(path: &str) -> String {
    fs::read_to_string(path).unwrap()
}

#[tokio::main]
async fn main() {
    // 使用 spawn_blocking 执行阻塞操作,返回一个 Future
    let handle = task::spawn_blocking(|| read_file_sync("test.txt"));

    // 等待阻塞操作完成,同时可执行其他异步任务
    let content = handle.await.unwrap();
    println!("文件内容:{}", content);
}

常见坑点与避坑指南

阻塞异步运行时

在 async 函数中使用同步阻塞操作,比如 std::thread::sleep、std::fs::read 等,导致工作线程被阻塞,破坏异步并发。这时,可以使用异步版本的 API,比如 tokio::time::sleep、tokio::fs::read_to_string。若必须使用同步 API,用 tokio::task::spawn_blocking 将其放入阻塞线程池。

忽略 Future 的执行

创建 Future 后未通过执行器轮询(如未 await、未 spawn),导致任务永远不会执行。如下所示:

async fn task() {
    println!("任务执行");
}

#[tokio::main]
async fn main() {
    task(); // 错误:仅创建Future,未执行
    // 正确:await或spawn
    // task().await;
    // tokio::spawn(task());
}

无界并发导致资源耗尽

无限制地使用 tokio::spawn 创建任务会导致任务数量过多,最终导致内存耗尽或 CPU 过载。建议使用 Tokio 提供的 Semaphore(信号量)限制并发任务数量,或使用 JoinSet 管理动态任务集合,避免无界并发。

总结

对于开发者而言,掌握 Rust 异步编程的关键是理解 Future 的惰性与状态机本质、熟悉 Executor 与 Reactor 的协作机制、熟练使用 Tokio 等框架的 API,并避开常见坑点。通过大量实践,才能真正构建出高效、可靠的并发应用。

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结 1、算法说明经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。AVM环视系统——鱼眼相机去畸变算法 - 知乎。 阅读详情

相关推荐

nupkg 本地安装_使用Nuget安装离线包nupkg

一:Nuget简介:NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。如果想要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解决方案里。NuGet能更方便地把一...

weixin_34460380的博客 1万+

MCP Toolbox:数据库操作革命性突破,打造AI原生数据工作流

在AI与数据深度融合的时代,MCP Toolbox for Databases 以开源MCP服务器的身份,为开发者带来了数据库操作的革命性范式转变。这不仅是另一个数据库连接工具,而是一个将AI原生能力深度融入数据工作流的专业级平台。 **核心关键词**:MCP Toolbox、数据库AI工具、模型上下文协议、数据工作流、开源MCP服务器 **长尾关键词**:AI原生数据库操作、多数据库统一管理

gitblog_00518的博客 911

计算机视觉三大顶会(ICCV/CVPR/ECCV)投稿指南与趋势解析

本文详细解析计算机视觉三大顶会(ICCV/CVPR/ECCV)的投稿指南与最新趋势。从基础认知到实战经验,涵盖时间线管理、选题策略、论文写作技巧及实验设计要点,帮助研究者提升投稿成功率。特别关注2024年技术融合、评估维度和伦理要求等前沿趋势,为计算机视觉领域的研究者提供实用建议。

weixin_29165725的博客 1851

Rust异步编程 Async Await 入门

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

xuejianxinokok的专栏 1657

ccproxy 6.61 注册机(纯绿/傻瓜/真正去除线程限制)

导读:   软件介绍   1、 CCPROXY 6.61 注册机(纯绿/傻瓜/真正去除线程限制)   ***前言,这次的升级官方改动不大,据说只是为了不被某些软件当病毒***   附件包中解压即免安装版,CcREGTOOLFF.exe为注册机。   本人继续向大家隆重推出《CCPROXY6.61哎呀……破解版》   还是那个提示:   在此之前,本人还是那句老话想提示大家,CCPROXY是

i53nd的专栏 1万+

UE4免费资产库新玩法:Quixel Bridge插件安装与Megascans资源导入全攻略

本文详细介绍了如何在UE4中安装Quixel Bridge插件并导入Megascans资源,帮助开发者快速获取高质量3D资产。通过分步教程和实用技巧,提升游戏或影视场景的制作效率,特别适合需要真实感环境的项目。

weixin_27729671的博客 370

Rust异步编程入门与实战:从理论到实践

在开始之前,我想先聊聊什么是异步编程。异步编程是一种编程范式,它允许程序在等待某些操作(如网络请求、文件I/O等)完成时,继续执行其他任务,而不是阻塞等待。传统的同步编程模型中,当我们执行一个耗时操作时,程序会一直等待这个操作完成,然后才继续执行下一步。这种方式在处理并发任务时效率较低,因为CPU在等待I/O操作时处于空闲状态。而异步编程模型中,当我们执行一个耗时操作时,程序会注册一个回调函数,然后继续执行其他任务。当耗时操作完成时,系统会通知程序,然后执行相应的回调函数。

no1coder的博客 1万+

OpenCV 开闭运算

开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。 但这两者并不是可逆的,即先开后闭并不能得到原来的图像。 开运算 开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像。 闭运算 闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域。 cv.morphologyEx(img, op, kernel) img: 要处理的图像 op: 处理方式:若进行开运算,则设为cv.MORPH_OPEN,若进行闭

꧁༺ʚvv༒catɞ༻꧂的博客 949

异步编程革命:Rust async/await完全指南

异步编程革命:Rust async/await完全指南 本文深入探讨了Rust异步编程的核心机制,从Future执行模型与任务调度机制、Pin和Unpin的内存安全原理,到Stream流处理与多Future并发技术,最后通过异步Web服务器实战开发展示完整应用。文章详细解析了Rust异步编程的底层实现原理和高级应用技巧,为开发者提供从基础到实战的完整指南。 Future执行模型与任务调度机制 在R...

gitblog_00027的博客 1262

【学一点英飞凌】AutoSar-MCAL-Gtm-TOM模块

本文基于英飞凌TC3X7芯片手册,GTM的TOM模块是产生并输出PWM的地方,想要彻底了解PWM,就必须知道它是怎么产生和如何被输出的。TOM通道还没有介绍的,详见下一篇;

qq_44688936的博客 6031

【微服务】Java 对接飞书多维表格使用详解

Java 对接飞书多维表格使用详解

congge_study的博客 1万+

Rust Async 异步编程(一):入门

Rust Async 异步编程(一):入门

ProgramNovice的博客 1388

【XCharts插件】3-1、制作图表及代码生成图表(v1.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录OK,这是v1.0版本的XCharts插件的创建图表,代码生成图表的教程。可能有人要问了,既然都更新到v3.0了,还写啥v1.0教程呢。因为有些项目就是用v1.0去制作图表了,也没有太多的精力去更新插件,所以就一直用的v1.0,而且v1.0已经能实现大部分的图标样式了,所以,博主还是单独写了一篇文章来介绍v1.0的功能。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1295

Tokio,Rust异步编程实践之路

Tokio,Rust异步编程实践之路 缘起 在许多编程语言里,我们都非常乐于去研究在这个语言中所使用的异步网络编程的框架,比如说Python的 Gevent、asyncio,Nginx 和 OpenResty,Go 等,今年年初我开始接触 Rust,并被其无 GC、内存安全、极小的运行时等特性所吸引,经过一段时间的学习,开始寻找构建实际项目的解决方案,很快 mio、tokio 等框架进入了我的...

行知致简的专栏 6876

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Rust 异步编程深入浅出指南

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

萧曳丶 1124

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

详解Rust异步编程

Rust的异步编程通过async/await语法和Future特性提供了一种高效的方式来处理并发任务,尤其在I/O密集型操作中表现出色。async/await异步编程模型性能高,还能支持底层编程,同时又像线程和协程那样无需过多的改变编程模型,但async模型的问题就是内部实现机制过于复杂,对于用户来说,理解和使用没有线程和协程简单。

yang1fei2的博客 3141

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Rust异步编程实战指南(从入门到精通的5个关键阶段)

掌握Rust异步编程核心技能,解决高并发场景下的性能瓶颈。涵盖Future、Tokio运行时、async/await语法、任务调度与错误处理,适用于网络服务与IO密集型应用。系统讲解从基础到进阶的5个关键阶段,实战示例助力高效开发,值得收藏。

FuncWander的博客 795

Rust异步编程指南

Rust异步编程指南 项目介绍 areweasyncyet.rs 是一个由Rust语言社区维护的项目,旨在跟踪Rust语言中异步编程功能的进展情况。该项目不仅提供了关于Rust异步编程的最新状态更新,还收集了相关的RFC、讨论和实现细节。通过这个项目,开发者可以了解到Rust异步编程的当前状态、已解决的问题以及未来的发展方向。 项目快速启动 安装Rust 首先,确保你已经安装了Rust编程语言。你...

gitblog_00403的博客 522

【Rust中的异步编程】

rust中的异步模型,实际上是使用future(能产出值的异步计算),通过轮询,挂起,唤醒,执行等操作来实现异步,runtime依赖tokio。Tokio是一个Rust 异步运行时库,底层基于epoll/kqueue这样的跨平台多路IO复用以及event loop,目前正在支持io_uring。其线程会执行task,可以充分利用多核,而Task 线程是Rust基于Future抽象出的一种绿色线程,因为不需要预先分配多余的栈内存,可以创建大量的Task,很适合做IO密集型应用。fn poll(

m0_37719524的博客 1676

Rust开发之路:从入门到实践的全面指南

首先,我们定义一个Taskid: u32,Task {id,Task结构体包含任务的ID、描述和是否完成的状态。Rust是一门独特且充满挑战的编程语言。通过深入学习Rust,我们不仅可以掌握系统编程的核心知识,还能在高性能应用开发中得心应手。从基础的内存安全管理到高级的并发编程,从简单的工具开发到复杂的Web应用,Rust为开发者提供了丰富的可能性。在这篇文章中,我分享了从零开始学习Rust的过程,探讨了Rust的独特特性和学习心得,并通过实际项目展示了Rust的应用。

一键难忘的博客 4636

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

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

gitblog_00969的博客 958

Rust异步编程详解:learn-rust-101教你掌握Tower框架

在Rust开发领域,异步编程是提升程序性能的关键技术之一,而Tower框架则是构建健壮网络服务的重要工具。learn-rust-101项目作为全面的Rust学习指南,为开发者提供了从基础到进阶的异步编程知识,其中对Tower框架的讲解更是帮助开发者轻松掌握这一强大工具。 ## 一、异步Rust的魅力所在 异步编程允许程序在等待某个操作完成时,继续执行其他任务,极大地提高了资源利用率和程序响应速

gitblog_00879的博客 732

Rust 异步编程详解(async/await)

Rust异步编程通过async/await语法和Future trait实现高效I/O处理,核心机制包括状态机模型和运行时调度。文章详细解析了异步编程基础、核心组件(Future trait、async/await语法)、工作流程,并提供了HTTP请求等代码示例。同时探讨了错误处理、任务取消、Pin/Unpin等高级话题,比较了不同运行时的适用场景。最佳实践建议选择合适运行时、避免阻塞操作,并指出异步编程在性能和安全方面的优势,以及调试复杂度等限制。附带的并发网络请求示例展示了tokio运行时的实际应用,包

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 2223

Rust for C++ Programmers:异步编程与Future模式完全指南

Rust作为一门注重安全与性能的系统级编程语言,为C++程序员提供了现代化的异步编程模型。本文将详细介绍Rust中的异步编程范式与Future模式,帮助C++开发者快速掌握这一强大特性,提升并发程序的效率与可靠性。 ## 为什么C++程序员需要关注Rust异步编程? 在C++中,异步操作通常依赖于回调函数、 futures 或第三方库(如Boost.Asio),这些方案往往存在内存安全隐患或使

gitblog_00974的博客 653

掌握Rust异步编程:Futures与async/await实践指南

本文介绍了Rust语言的异步编程模型,重点讲解了Futures和async/await的使用。通过异步编程,可以提高程序在处理I/O密集型任务时的效率和响应速度。Rust的异步编程模型使得编写异步代码更加简洁易懂,有助于提升程序性能。

silenceallat的博客 1398

Asynchronous Programming in Rust:掌握异步编程的艺术

Asynchronous Programming in Rust:掌握异步编程的艺术 项目介绍 在现代编程领域,异步编程已经成为提高应用性能和响应速度的关键技术。Asynchronous Programming in Rust 是一本深度探索 Rust 语言异步编程机制的书籍,通过丰富的实例和深入的解析,帮助开发者掌握异步编程的核心概念和实用技巧。 项目技术分析 Rust 作为一门系统编程语言,以...

gitblog_00177的博客 1122
上一篇: Rust 多线程从入门到实战
下一篇: Rust Pin 解析:核心原理与异步编程实践
Rust研习社
博客等级 码龄11年 52粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值