解决async/await页面卡顿:理解并发处理的正确方法

await Promise内部执行setTimeout定时器,提前clearTimeout,导致卡死的情况分析及解决方案 在我们日常开发中,我们常常需要在某个地方暂停某个动作一段时间。这个时候,我们的通常做法是使用setTimeout,配合promise实现。也就是如下代码。}, ms);});// 等待Promise的resolve操作完成但我们偶尔需要提前终止这个定时器。这时候我们会需要使用JavaScript 自带的clearTimeout方法,这个方法要求我们传入 timeoutId,也就是这个定时器的Id}, ms) 阅读详情

前言 

你可能遇到过这种情况:你在JavaScript中使用了async/await来处理异步操作,比如循环请求用户列表数据,结果页面却长时间白屏,直到所有请求都完成后才显示内容。这让你感到困惑:不是说async/await是非阻塞的吗?它怎么会让页面卡住呢?

这个问题触及了async/await、浏览器任务处理和页面渲染的核心机制。让我们一步步搞清楚。

误解澄清:await 到底会不会阻塞?

先说最重要的:async/await本身不会阻塞浏览器的JavaScript主线程。 它只是让写异步代码看起来像写同步代码的一种方式。

当JavaScript引擎碰到await关键字时,它会暂停当前async函数的执行,把控制权交还给浏览器的主线程。

这时主线程是空闲的,它可以去做其他事情:响应用户的点击、滚动,运行其他脚本代码,还有最重要的——更新页面显示(渲染)。

等到await后面的那个操作(通常是一个Promise)完成后,浏览器会在合适的时候(主线程空闲时)把这个async函数暂停的地方继续执行下去。

听起来很完美?那为什么页面还是卡住了呢?

真正的罪魁祸首:一个接一个的等待

问题往往出在代码怎么写上。看看下面这个常见的错误例子:

// 模拟一个获取用户数据的api请求
functionfetchUser(id) {
returnnewPromise(resolve => {
setTimeout(() => {
console.log(`获取到用户 ${id}`); // 模拟网络请求
      resolve({ id: id, name: `用户 ${id}` });
    }, 1000); // 假设每个请求需要1秒钟
  });
}

// 错误做法:在循环里一个接一个地等
asyncfunctiongetAllUsers(userIds) {
console.time('获取所有用户耗时');
const users = [];
for (const id of userIds) {
// 关键问题:这里会停下来等,等上一个请求彻底完成,才会开始下一个
const user = await fetchUser(id);
    users.push(user);
  }
console.timeEnd('获取所有用户耗时');
// 假设这里是把用户数据显示到页面上
  showUsers(users);
return users;
}

const userIds = [1, 2, 3, 4, 5];
getAllUsers(userIds);
// 控制台输出:获取所有用户耗时: 约5000毫秒

问题很明显:这5个请求是一个接一个执行的。

第一个请求发出后,代码就停下来等它1秒完成,然后才开始第二个请求,再等1秒,如此反复。

总共花了差不多5秒钟。而更新页面显示的那个showUsers(users)函数,必须等到这漫长的5秒全部结束后才会被调用。

在这5秒里,虽然浏览器的主线程在每次await等待时确实可以去处理别的事情(比如你点了按钮它可能还能响应)。

但因为你的代码逻辑就是让所有事情排队做,页面在等待期间没有任何新内容可以显示。

用户看到的就是一个长时间空白或内容不更新的页面,感觉就像页面“卡死”了。

解决之道:让请求一起 - Promise.all

如果这些请求之间不需要等对方的结果(比如获取用户1的数据不需要先知道用户2的数据),那完全可以让它们同时发出去!这就是Promise.all的用武之地。

Promise.all接收一个包含多个Promise(代表那些异步操作)的数组。它自己返回一个新的Promise。

这个新Promise会等到数组里所有的Promise都成功完成(resolved)后,才成功,并把所有结果打包成一个数组给你。

改造上面的代码:

asyncfunctiongetAllUsersFast(userIds) {
console.time('并行获取所有用户耗时');
// 1. 创建请求数组:每个元素都是 fetchUser(id) 调用返回的Promise
const userPromises = userIds.map(id => fetchUser(id));

// 2. 使用 Promise.all 等待所有请求完成
const users = awaitPromise.all(userPromises);

console.timeEnd('并行获取所有用户耗时'); // 输出:约1000毫秒
  showUsers(users);
return users;
}

getAllUsersFast(userIds);

效果立竿见影!总时间从5秒缩短到了大约1秒(取决于最慢的那个请求)。页面也能更快地显示出用户数据,用户体验好得多。

更多实用工具:不同场景用不同方法

Promise.all很强大,但并不是唯一的选择。根据你的具体需要,还有其他好帮手:

  1. Promise.allSettled:每个都要结果,不管成功失败
    如果有些请求可能会失败,但你不想让一个失败就中断所有,还想知道每个请求最终是成功还是失败了,用Promise.allSettled。

    asyncfunctiongetUsersWithStatus(userIds) {
    const promises = userIds.map(id => fetchUser(id).catch(error => error)); // 捕获错误,避免整个Promise.allSettled失败
    const results = awaitPromise.allSettled(promises);
    
    // 处理结果:results 是一个数组,每个元素是对象
    // { status: 'fulfilled', value: 结果 } 或 { status: 'rejected', reason: 错误原因 }
      results.forEach(result => {
    if (result.status === 'fulfilled') {
    console.log('成功:', result.value);
        } else {
    console.log('失败:', result.reason);
        }
      });
    return results; // 或者根据 status 过滤出成功的数据
    }
  2. Promise.race 和 Promise.any:谁快用谁

    1)Promise.race: 只要数组里有一个Promise完成(无论是成功还是失败),它就立刻完成,结果或错误就是那个最快的Promise的。

    适合做超时控制或者从多个来源取最快响应(比如测哪个CDN快)。

    asyncfunctiongetFirstResponse() {
    const timeoutPromise = newPromise((_, reject) =>setTimeout(() => reject(newError('超时!')), 500));
    const dataPromise = fetchUser(1);
    
    try {
    const result = awaitPromise.race([dataPromise, timeoutPromise]);
    console.log('成功获取数据:', result);
      } catch (error) {
    console.log('出错或超时:', error.message);
      }
    }

    2)Promise.any: 等待第一个成功完成的Promise。只有数组里所有的Promise都失败了,它才失败。适合需要尝试多个途径,只要有一个成功就行。

    asyncfunctiongetFromAnySource(sources) {
    try {
    const firstSuccess = awaitPromise.any(sources.map(source => fetch(source)));
    console.log('从最快成功的源获取:', firstSuccess);
      } catch (errors) { // 注意:错误是 AggregateError
    console.log('所有源都失败了:', errors);
      }
    }

    3)控制同时请求的数量:别把服务器压垮
    如果你的用户ID列表有1000个,用Promise.all会瞬间发出1000个请求。

    这可能会让你的服务器崩溃,或者被浏览器限制(浏览器通常对同一域名有并发请求数限制,比如6-8个)。

    这时候你需要一个“池子”来控制同时进行的请求数量。这里提供一个简单但有效的实现方法:

    asyncfunctionrunWithConcurrency(tasks, maxConcurrent) {
    const results = []; // 存放所有任务的最终结果(Promise)
    const activeTasks = []; // 当前正在执行的任务对应的Promise(用于跟踪)
    
    for (const task of tasks) {
    // 1. 创建代表当前任务的Promise。`() => task()` 确保任务在需要时才启动
    const taskPromise = Promise.resolve().then(task);
        results.push(taskPromise); // 保存结果,最后统一用 Promise.all 等
    
    // 2. 创建任务完成后的清理操作:从 activeTasks 中移除自己
    const removeFromActive = () => activeTasks.splice(activeTasks.indexOf(removeFromActive), 1);
        activeTasks.push(removeFromActive); // 注意:这里存的是清理函数对应的Promise
    
    // 3. 如果当前活跃任务数已达上限,就等任意一个完成
    if (activeTasks.length >= maxConcurrent) {
    awaitPromise.race(activeTasks); // 等 activeTasks 数组里任意一个Promise完成
        }
    
    // 4. 将清理操作与实际任务完成挂钩
        taskPromise.then(removeFromActive, removeFromActive); // 无论成功失败都清理
      }
    
    // 5. 等待所有任务完成(无论是否在活跃池中)
    returnPromise.allSettled(results); // 或者用 Promise.all(results) 只关心成功
    }
    
    // 使用示例
    const userIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    // 将 fetchUser(id) 调用包装成无参数的函数数组
    const tasks = userIds.map(id =>() => fetchUser(id));
    
    // 最多同时发出 3 个请求
    runWithConcurrency(tasks, 3).then(results => {
    console.log('所有用户获取完成 (并发控制):', results);
    });

    这个函数会确保最多只有maxConcurrent个请求同时在进行。

    当一个请求完成,池子里有空位了,才会开始下一个请求。在实际项目中,你也可以使用成熟的库如 p-limit 或 async 的 queue 方法来实现更强大的并发控制。

关键总结

  • async/await 本身不会阻塞浏览器主线程。

  • 页面卡顿通常是因为代码逻辑(如在循环中串行await)导致了不必要的长时间等待。

  • 对于独立的异步任务(如多个API请求),使用 Promise.all 让它们并行执行是大幅提升速度和用户体验的关键。

  • 根据需求选择工具:Promise.allSettled(都要结果)、Promise.race/Promise.any(用最快的)、手动或库实现的并发控制(防服务器过载)。

  • 理解浏览器的事件循环和渲染机制有助于写出更流畅的代码。记住:长时间的同步逻辑(包括在async函数里连续await造成的等待)会推迟渲染。

掌握这些并发处理技巧,你就能充分利用async/await的优势,写出既高效又不会让用户感觉页面卡顿的JavaScript代码了。

关于优联前端

        武汉优联前端科技有限公司由一批从事前端10余年的专业人才创办,是一家致力于H5前端技术研究的科技创新型公司,为合作伙伴提供专业高效的前端解决方案,合作伙伴遍布中国及东南亚地区,行业涵盖广告,教育, 医疗,餐饮等。有效的解决了合作伙伴的前端技术难题,节约了成本,实现合作共赢。承接开发Web前端,微信小程序、小游戏,2D/3D游戏,动画交互与UI广告设计等各种技术研发。

Unity异步编程实战:async/await核心原理与性能优化指南 异步编程是现代软件开发中提升应用响应性和资源利用率的核心技术,其原理在于通过非阻塞操作让主线程在等待耗时任务时继续处理其他工作。在游戏开发领域,这一技术价值尤为突出,能有效解决界面卡顿、加载阻塞等实时交互难题。通过Task状态机机制,开发者可以用同步的代码风格编写异步逻辑,大幅提升代码可读性和可维护性。在Unity引擎中,async/await已深度集成到资源加载、网络请求等关键场景,配合Awaitable类型可确保线程安全地操作游戏对象。本文聚焦Unity异步编程的最佳实践,涵盖TaskCompletio 阅读详情

相关推荐

C# WinForm异步编程实战:如何用async/await让进度条不再卡顿(附完整代码)

本文详细介绍了如何在C# WinForm中使用async/await实现异步编程,解决进度条卡顿问题。通过实战代码演示了Task.Run、IProgress<T>接口等多种方法,帮助开发者提升UI响应性,避免常见异步陷阱,并附赠完整带取消功能的案例代码。

bash7scripter的博客 406

async、await 优缺点,你可以知道

async、await 优缺点 async 和 await 相比直接使用 Promise 来说,优势在于处理 then 的调用链,能够更清晰准确的写出代码。缺点在于滥用 await 可能会导致性能问题,因为 await 会阻塞代码,也许之后的异步代码并不依赖于前者,但仍然需要等待前者完成,导致代码失去了并发性 下面来看一个使用 await 的代码。 var a = 0 var b = async ...

曹豆芽 4257

BrainVision Recorder 和 BrainVision Analyzer 2.2 安装

本篇为《EEG处理》系列博客的第二篇,该系列博客主要记录EEG信号处理的学习过程中的软件安装和学习过程,方便以后查阅。本篇为BrainVision Recorder 和 BrainVision Analyzer 2.2 的安装过程。 BrainVision Recorder 和 BrainVision Analyzer 2.2 安装安装前奏Brain Vision Analyzer分析软件 安装Brain Vision Recorder记录软件 安装推荐几款个人使用的科研软件 安装前奏 Brain V

梁小憨憨的博客 5064

小心C# 5.0 中的await and async模式造成的死锁

平时在使用C# 5.0中的await and async关键字的时候总是没注意,直到今天在调试一个ASP.NET项目时,发现在调用一个声明为async的方法后,程序老是莫名其妙的被卡住,就算声明为async的方法中的Task任务执行完毕后,外部方法的await调用还是阻塞着,后来查到了下面这篇文章,才恍然大悟原来await and async模式使用不当很容易造成程序死锁,下面这篇文章通...

664

Android——Handler详解

1. 简介 Handler是一套 Android 消息传递机制 可以说只要有异步线程与主线程通信的地方就一定会有 Handler。 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理 使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全 2. 相关概念解释 Handler、Message、Message Queue、Looper Android消息机制: 以Handler的sendMes

Yawn 7万+

vLLM 多机多卡推理测试与验证(Kubernetes)vLLM 多机多卡推理 Kubernetes 验证

本文记录在两台 L20 机器,每台机器 4 块 L20 显卡(46G)的环境下,使用 vLLM 部署 Qwen2.5-32B-Instruct-GPTQ-Int4 模型并提供多节点多卡推理服务的过程。服务(Serving)模型服务是指将模型部署到生产环境中,通过 API 或其他接口提供预测服务的过程。【分布式推理与服务】(Distributed Inference and Serving)是指在多个机器或设备之间部署和管理机器学习模型,以高效地处理推理请求并满足大规模服务需求。3、启动 vLLM 服务。

流水_鱼鱼的博客 3459

服务器axios响应慢,axios异步请求一次踩坑

背景一次在用react写用户修改时,想着将用户基础信息和用户所属角色存储在state中,然后显示。部分代码如下,结果发现运行出来的结果和预料的不一致。这个是为什么呢??真的是纠结了半个下午。class UserEdit {this.state = {initialValue : {roleIds : []}}componentDidMount() {this.treeSelectRoles();t...

weixin_33844346的博客 1625

uniapp 全局弹窗

功能详解1.有的组件需要全局调用,不想要在一个页面里面一个个引入,现在就需要写入到全局中,直接全局触发。2.通过 $rechargePop就能全局触发 充值的弹窗实现步骤一、先把组件封装好,如 rechargePop组件位置 components/RechargePop/index.vue ,就定义一个methods open方法就可以 二、在同级别路径下定义一个 index.js 三、引入到main.js 四、全局调用this.$rechargePop(); 就能弹出那个弹窗

weixin_42066070的博客 657

深入理解异步编程:Task、async/await 及其背后原理

本文深入解析C#异步编程的核心机制,重点介绍Task和async/await的使用与原理。首先对比同步与异步的区别,阐释异步编程在提升程序响应性和吞吐量方面的优势。详细分析async/await背后的状态机工作原理,揭示编译器如何将异步方法转换为状态机类。针对常见误区,澄清异步与多线程的本质差异,指出I/O操作应使用真正的异步方法而非Task.Run。同时列举典型错误模式,如async void、阻塞等待等,并给出正确实践方案。最后提供多场景应用指南,包括并发任务处理、UI线程优化和自定义异步任务实现,帮助

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 945

Python爬虫实战:58同城租房信息分析与可视化,寻找高性价比房源

随着城市化进程加快,租房需求日益增长。58同城作为国内领先的本地生活服务平台,汇聚了大量房源信息。本教程将使用最新的Python爬虫技术获取58同城租房数据,通过数据分析与可视化揭示各区域租金水平,并运用机器学习算法找出性价比高的房源。本项目将使用异步爬虫、反爬对抗技术、数据清洗、可视化分析和机器学习建模等技术栈。

2201_76125261的博客 1279

OpenCV实战系列——图像线条提取

基于内容的图像分析,需要从构成图像的像素集合中提取有意义的特征。轮廓、线条、区域等是基本的图像基元,可用于描述图像中包含的元素。本节将介绍如何提取重要的图像线条特征。

m0_58523831的博客 1万+

JS异步编程:从回调地狱到Async/Await的华丽转身

JavaScript异步编程从回调地狱到优雅的Async/Await演进 本文深入浅出地讲解了JavaScript异步编程的发展历程。首先介绍了异步编程的基本概念,通过外卖点餐的生动比喻说明了异步思维的重要性。随后详细阐述了三种主流异步编程方案: 回调函数:异步编程的基础实现方式,但容易陷入层层嵌套的回调地狱问题 Promise:通过状态管理和链式调用解决了回调嵌套问题,提供了all/race等并发控制方法 Async/Await:ES2017引入的终极方案,以同步方式编写异步代码,大幅提升可读性 。

m0_60941346的博客 1183

cadence17.4和16.6同时安装无法使用的问题

经过对报错的问题分析,发现还是17.4的lic文件和16.6的不一样,16.6的版本总是无法找到自己对应的lic文件。卸载了,重新单独安装16.6,这里就是正确的。包括使用这些工具去修复这些问题,都无法接近。已经放弃了,使用哪个版本就安装 哪个版本。这个也无法解决问题。

D_Katter的博客 2324

Swift并发编程实战:如何正确使用async/await避免常见陷阱?

掌握Swift并发编程核心技巧,解决iOS开发中线程阻塞与数据竞争难题。结合Swift iOS应用实战场景,深入解析async/await的正确用法,涵盖任务优先级、子任务派发与错误处理等关键点,提升应用性能与稳定性,值得收藏。

LiteCompile的博客 1036

淋巴结病理数字玻片读取与处理代码

Whole-slide images are generally stored in a multi-resolution pyramid structure. 首先安装openslide模块 pip install openslide-python import os.path as osp import openslide from pathlib import Path...

猫头军师兵书 1276

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java await async_理解async/await

首先明确一个问题,为什么 Node.js 需要异步编程?JavaScript 是单线程的,在发出一个调用时,在没有得到结果之前,该调用就不返回,意思就是调用者主动等待调用结果,换句话说,就是必须等待上一个任务执行完才能执行下一个任务,这种执行模式叫:同步。Node.js 的主要应用场景是处理高并发(单位时间内极大的访问量)和 I/O 密集场景(ps: I/O 操作往往非常耗时,所以异步的关键在...

weixin_33302571的博客 630

深度学习工具包 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")

C#-有关同步异步(Async/Await)的理解

介绍了C#中同步异步方法的区别及易产生的误解

龟速船长 1085

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

理解async/await

首先明确一个问题,为什么 Node.js 需要异步编程? JavaScript 是单线程的,在发出一个调用时,在没有得到结果之前,该调用就不返回,意思就是调用者主动等待调用结果,换句话说,就是必须等待上一个任务执行完才能执行下一个任务,这种执行模式叫:同步。 Node.js 的主要应用场景是处理高并发(单位时间内极大的访问量)和 I/O 密集场景(ps: I/O 操作往往非常耗时,所以异步的关键在...

丁晓东go 173

【C# MVC 前置】异步编程 async/await:从 “卡界面” 到 “秒响应” 的 Action 优化指南(附微软官方避坑清单)

文章摘要:本文介绍了async/await在MVC开发中的核心应用,通过线程复用机制解决同步操作导致的界面卡顿问题。文章首先通过流程图对比同步/异步执行差异,说明异步编程如何提高并发能力。随后给出3个典型场景的完整代码实现:1)EF Core异步查询数据库避免线程占用;2)异步处理文件上传与入库;3)HttpClient异步调用第三方接口。关键要点包括:优先使用原生异步方法(如ToListAsync)、正确配置Task返回值类型、避免使用Task.Run包装同步方法等。这些技巧可显著提升MVC应用的响应速度

William_cl的博客 2891

.NET Runtime异步编程:async/await原理详解

在现代应用程序开发中,I/O密集型操作(如网络请求、文件读写、数据库查询)是性能瓶颈的主要来源。传统的同步编程模型会导致线程阻塞,浪费宝贵的系统资源。你是否曾经遇到过: - 应用程序界面卡顿,用户体验差 - 服务器并发处理能力有限,无法应对高负载 - 线程资源浪费,系统吞吐量低下 .NET的async/await异步编程模型正是为了解决这些问题而生。本文将深入剖析.NET Runtime中as...

gitblog_00879的博客 1172

PouchDB 异步编程实战指南:回调、Promise 与 async/await 全解析

PouchDB 是一个运行在浏览器与 Node.js 中的 JavaScript 数据库,其 API 完全异步设计,旨在避免数据库操作阻塞 UI 线程。本篇以 PouchDB 官方指南中的异步编程章节为主体,结合仓库源码,系统讲解 PouchDB 的**回调(callback)与 Promise 双格式 API**、**错误捕获机制**、**Promise 链式调用的三种行为**,并延伸到现代 *

gitblog_00198的博客 644

深入浅出 JavaScript 异步编程:从回调地狱到 Async/Await

回调函数:基础方案,但嵌套问题严重Promise:解决回调地狱,提供链式调用和统一错误处理Generator:引入暂停 / 恢复机制,为 Async/Await 奠定基础:当前最优方案,让异步代码 "同步化"在实际开发中,建议优先使用的组合,它们既能保证代码的可读性,又能灵活处理各种异步场景。同时需注意并行任务的优化和错误处理的完整性,让异步代码既高效又健壮。希望本文能帮助你理清 JavaScript 异步编程的脉络,写出更优雅的异步代码!

苏打水.X的博客 916

JavaScript 中的 Promise、async/await 和异步编程

在 JavaScript 中,代码默认是同步执行的,即每一行代码都会按顺序执行,前一行代码执行完毕后才会执行下一行。然而,某些操作(如网络请求、文件读写等)可能需要花费较长时间,如果使用同步方式,程序会一直等待这些操作完成,导致页面卡顿或无响应。让耗时的操作在后台执行,同时不阻塞主线程。当操作完成后,再通过回调函数、Promise 或 async/await 来处理结果。Promise是 JavaScript 中处理异步操作的基础,它提供了.then()和.catch()方法来处理成功和失败的情况。

m0_73659339的博客 1433

理解Ajax异步编程:从axios到async/await的演进

本文从JavaScript单线程模型的核心特性出发,深入剖析了异步编程成为前端开发必备技能的根本原因。通过对比同步操作可能导致的页面阻塞问题,引出了Ajax技术(异步网络请求与局部更新)的重要性。文章详细介绍了现代、易用的HTTP请求库axios的基本用法与异步实现原理,并进一步讲解了如何使用ES7的async/await语法糖,以同步代码的书写风格来编写异步逻辑,从而大幅提升代码的可读性和可维护性。这是一份从理论到实战的完整异步编程指南。

z6x6p的博客 357

前端异步编程实战:从事件循环到Promise/async/await,告别接口卡顿

浏览器基于单线程模型执行JavaScript,同步请求会阻塞主线程,导致页面渲染与交互中断,形成“卡成PPT”的体感。事件循环机制则通过任务队列实现异步调度,是前端性能优化的底层逻辑。从回调函数到Promise再到async/await,异步方案不断演进,核心在于写出非阻塞流程。并发请求场景下,合理运用Promise.all与Promise.race能大幅缩短等待时间,解决接口竞态与超时问题。面对多接口报表或搜索场景,掌握异步编程是提升用户体验的关键突破口。本文围绕事件循环原理,拆解异步三件套的适用边界,并

weixin_28025327的博客 226
上一篇: 时间管理的视觉艺术 《时间格子计算器》H5案例赏析
下一篇: 自我探索之旅:哲学人格测试H5案例赏析
优联前端
博客等级 码龄5年 1832粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值