当前位置: 首页 > news >正文

JavaScript 单线程防阻塞的原理

JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。这种设计可能会导致一些问题,比如当遇到耗时的操作时,整个程序可能会被阻塞。为了解决这个问题,JavaScript 使用了事件循环和回调函数的机制,实现了非阻塞式的异步操作。

事件循环

JavaScript 有一个事件队列,用于存放需要执行的任务。事件循环不断地检查这个事件队列,当队列中有可执行的任务时,就从队列中取出任务执行。

当 JavaScript 遇到耗时的操作(如 I/O 操作)时,它会将这些操作交给浏览器或 Node.js 运行时处理,并继续执行事件循环中的其他任务。这样可以确保主线程不会被阻塞,保持程序的响应性和交互性。

宏任务和微任务

事件队列中的任务分为两种类型:宏任务微任务

  • 宏任务包括常见的 JavaScript 代码、setTimeout、setInterval 等。这些任务会被添加到事件队列的末尾,等待事件循环执行。
  • 微任务包括 Promise 的回调、process.nextTick (Node.js) 等。这些任务会被添加到当前宏任务执行完成后的微任务队列中,优先于下一个宏任务执行。

事件循环在执行一个宏任务后,会检查并执行所有的微任务队列,然后再执行下一个宏任务。这种机制确保了微任务可以更快地得到执行,提高了程序的响应性。

回调函数

当耗时的操作完成时,浏览器或 Node.js 运行时会触发一个事件,并将相应的回调函数放入事件队列中。

事件循环会检测到这个回调函数,并从队列中取出执行它。这就实现了非阻塞式的异步操作,防止单线程的 JavaScript 被耗时的操作阻塞。

实际应用

这种事件循环、宏任务和微任务的机制在 JavaScript 编程中广泛应用:

  1. 网页交互: 在网页开发中,我们经常使用回调函数来处理用户交互,如点击事件、表单提交等。这些操作通常不会阻塞主线程,确保页面保持高度响应性。
  2. 网络请求: 当发送 AJAX 请求时,我们通常会使用回调函数来处理服务器的响应。这样可以确保在请求过程中,用户仍然可以与页面进行交互。
  3. 定时器setTimeout() 和 setInterval() 函数也利用了事件循环的机制。它们会将定时器任务添加到事件队列中,等待执行。
  4. Node.js 中的异步操作: Node.js 也是基于事件循环和回调函数的机制实现异步操作,如文件 I/O、数据库查询等。这确保了 Node.js 应用程序可以高效地处理大量并发请求。

此外,还有一些其他的应用场景:

  1. 事件驱动模型: JavaScript 的事件循环机制很适合实现事件驱动模型,这在 Web 开发和 Node.js 中广泛应用。
  2. 错误处理: 当异步操作发生错误时,可以通过回调函数的方式进行错误处理,避免整个程序崩溃。
  3. 流式处理: 在处理大量数据时,可以使用流的方式进行异步处理,提高性能和内存利用率。

相关文章:

JavaScript 单线程防阻塞的原理

JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。这种设计可能会导致一些问题,比如当遇到耗时的操作时,整个程序可能会被阻塞。为了解决这个问题,JavaScript 使用了事件循环和回调函数的机制,实现了非阻塞式的异步操作。 事件循环 JavaScript 有一个事件队列,用…...

Shell脚本发送邮件的详细步骤与配置方法?

Shell脚本发送邮件的进阶技巧?怎么配置Shell脚本发信? 使用Shell脚本发送邮件是一种高效的自动化手段,特别是在需要定期发送报告、通知或警告信息时。AokSend将详细介绍Shell脚本发送邮件的步骤与配置方法,帮助您更好地掌握这一技…...

如何把Phalcon 集成到PhpStorm里面

一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…...

python从入门到精通:循环语句

目录 前言 1、while循环的基础语法 2、while循环的嵌套 3、for循环的基础语法 range语句: for循环临时变量作用域: 4、for循环的嵌套 5、循环中断:break和continue 前言 循环普遍存在于日常生活中,同样,在程序中…...

Codeforces Round 965 (Div. 2)

前言 有人在过七夕,我在打 cf ,还有某人独自一人在学校机房,凌晨一点骑上共享单车回宿舍欣赏沿途的秋风扫落叶。 Standings:2166 题目链接:Dashboard - Codeforces Round 965 (Div. 2) - Codeforces A. Find K Distin…...

Win10下载安装Mysql服务

Win10下载安装MySQL 一、官网下载MySQL 1.官网地址: https://www.mysql.com/ 2.在官网首页拉到最下方,点击MySQL Community Server: 3.根据个人电脑的操作系统选择,此处以Windows x64为例,选择第2个,点击…...

MVVM(Model-View-ViewModel)架构模式

在Android开发中,MVVM(Model-View-ViewModel)架构模式已经成为构建可维护和可扩展应用程序的重要选择。MVVM模式通过分离视图(View)、模型(Model)和视图模型(ViewModel)来…...

C#MVC返回DataTable到前端展示。

很久没写博客了,闭关太久,失踪人口回归,给诸位道友整点绝活。 交代下背景:要做一个行转列的汇总统计,而且,由于是行转列,列的数量不固定,所以,没法使用正常的SqlSugar框…...

HttpUtils工具类(二)Apache HttpClient 5 使用详细教程

目录 一、Apache HttpClient 5介绍 (1)核心特性 (2)Apache HttpClient 5 的新特性 (3)在 Java 项目的主要使用场景及缺点 使用场景: 缺点: 二、在实际项目中的应用 &#xf…...

Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)

1、Vue 2.0 生命周期钩子 每个应用程序实例在创建时都有一系列的初始化步骤。例如,创建数据绑定、编译模板、将实例挂载到 DOM 并在数据变化时触发 DOM 更新、销毁实例等。在这个过程中会运行一些叫做生命周期钩子的函数,通过这些钩子函数可以定义业务逻…...

遥感之常用各种指数总结大全

目前在遥感领域基本各种研究领域都会用到各种各样的指数,如水体指数,植被指数,农业长势指数,盐分指数,云指数,阴影指数,建筑物指数,水质指数,干旱指数等等众多。 本文对上…...

【C++】C++11新增特性

目录 C11简介: 1、统一的列表初始化: std::initializer_list 2、自动类型推导: auto: decltype: 3、final 和 override final: override: 4、默认成员函数控制: 显示缺省…...

【LeetCode每日一题】——662.二叉树最大宽度

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先搜索 二【题目难度】 中等 三【题目编号】 662.二叉树最大宽度 四【题目描述】 给…...

第二十三节、血量更新逻辑的实现

一、创建代码 引入命名空间 using UnityEngine.UI; 调用UI必须有这个代码 二、ScriptObject类 1、是一个持久化存储文件的类型 接收所有的事件方法 先继承SO类,然后创建项目菜单 2、进行订阅 放入事件类,关联代码,即可进行广播 传递给这…...

Spring Authorization Server 认证服务器搭建

Spring Authorization Server实现了oauth2和oidc,最近有了解相关技术的需求,所以就尝试着进行了基本的环境搭建和技术测试,目前只测试了授权码模式,做一个记录,后续需要用时方便查找和参考。 1. 版本要求 Spring Authorization Server 版本:1.3.1 JDK 版本:17 Spring B…...

秋招突击——8/15——知识补充——垃圾回收机制

文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器(Garbage First垃圾优先&#x…...

【iOS】UITableViewCell的重用问题解决方法

我自己在实验中对cell的重用总结如下: 非自定义Cell和非自定义cell的复用情况一样: 第一次加载创建tableView的时候,是屏幕上最多也显示几行cell就先创建几个cell,此时复用池里什么都没有开始下滑tableView,刚开始滑…...

开发一个微信小程序商城需要哪些技术栈

开发一个小程序商城需要掌握以下技术栈:‌ 前端技术:‌包括HTML、‌CSS和JavaScript,‌用于定义商城的页面结构、‌样式设计和交互功能。‌ 微信小程序专用技术:‌如WXML、‌WXSS、‌JavaScript和JSON,‌用于描述小程…...

望繁信科技荣膺上海市浦东新区博士后创新实践基地称号

近日,上海望繁信科技有限公司(简称“望繁信科技”)凭借在大数据流程智能领域的卓越表现,成功入选上海市浦东新区博士后创新实践基地。这一荣誉不仅是对望繁信科技创新能力和技术实力的高度认可,也标志着公司在推动产学…...

Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、代理原理 1、反向代理产生的背景 单个服务器的处理客户端(用户)请求能力有一个极限,当接入请求过多时&#…...

3步零基础掌握星露谷物语SMAPI模组加载器:高效管理你的模组世界

3步零基础掌握星露谷物语SMAPI模组加载器:高效管理你的模组世界 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI SMAPI(Stardew Valley Modding API)是星露谷物语官…...

AICoverGen终极指南:快速创建AI翻唱歌曲的完整教程

AICoverGen终极指南:快速创建AI翻唱歌曲的完整教程 【免费下载链接】AICoverGen A WebUI to create song covers with any RVC v2 trained AI voice from YouTube videos or audio files. 项目地址: https://gitcode.com/gh_mirrors/ai/AICoverGen 想要让你的…...

DeepSeek代码审查能力白皮书(2024企业级实测报告)

更多请点击: https://kaifayun.com 第一章:DeepSeek代码审查能力白皮书(2024企业级实测报告)概述 本报告基于2024年Q1至Q3期间,面向金融、电信与云原生三大垂直行业的17家头部企业客户开展的深度实测,覆盖…...

C++的单例模式及其作用

什么是单例模式?无论是在面向对象编程还是软件架构中,单例模式都扮演着至关重要的角色。它不仅能够确保一个类只有一个实例存在,还能够提供全局访问点,使得我们可以方便地在程序的任何地方使用该实例。但有几个设计模式并非解决抽…...

热电效应自发电自行车灯:利用体温实现免充电照明的工程实践

1. 项目概述:从人体体温到自行车灯光你有没有想过,骑自行车时身体散发出的热量,除了让你出汗,还能干点什么?这个项目就是把我们骑车时产生的“废热”,变成照亮前路的灯光。听起来有点像科幻情节&#xff0c…...

监控摄像头小众场景爆发,融合类产品成新蓝海

随着户外运动热潮的持续和物联网技术的全面落地,打猎相机市场在2025年迎来了真正的爆发期,并在2026年继续向智能化、网联化深度演进。根据最新的行业监测数据,2025年全球消费类IPC(网络摄像机)出货量突破1.92亿台&…...

AFOAuth2Manager调试技巧:常见问题排查与解决方案

AFOAuth2Manager调试技巧:常见问题排查与解决方案 【免费下载链接】AFOAuth2Manager AFNetworking Extension for OAuth 2 Authentication 项目地址: https://gitcode.com/gh_mirrors/af/AFOAuth2Manager AFOAuth2Manager是AFNetworking的OAuth 2.0认证扩展库…...

摄影老司机_给照片加边框工具

使用简单, 支持自定义主题 自定义logo 内置四个常用的logo 为什么没有佳能? 因为我没有佳能 外框和内框是什么意思? 外框就是纯色边框 内框,就是将你上传的照片复制一张,放大,作为外框 外框宽度可以自定义 摄影师署名自定义 相机型号有时候识别出来又臭又长,说的就是尼康,所以…...

3分钟学会:如何在浏览器中零服务器依赖将HTML转为Word文档

3分钟学会:如何在浏览器中零服务器依赖将HTML转为Word文档 【免费下载链接】html-docx-js Converts HTML documents to DOCX in the browser 项目地址: https://gitcode.com/gh_mirrors/ht/html-docx-js 还在为HTML内容导出Word文档而烦恼吗?html…...

终极指南:如何在Windows上直接访问Linux RAID阵列数据

终极指南:如何在Windows上直接访问Linux RAID阵列数据 【免费下载链接】winmd WinMD 项目地址: https://gitcode.com/gh_mirrors/wi/winmd 你是否曾面临这样的困境:企业Linux服务器上存储着重要的业务数据,使用mdadm创建的RAID阵列运行…...