JavaScript 单线程防阻塞的原理
JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。这种设计可能会导致一些问题,比如当遇到耗时的操作时,整个程序可能会被阻塞。为了解决这个问题,JavaScript 使用了事件循环和回调函数的机制,实现了非阻塞式的异步操作。
事件循环
JavaScript 有一个事件队列,用于存放需要执行的任务。事件循环不断地检查这个事件队列,当队列中有可执行的任务时,就从队列中取出任务执行。
当 JavaScript 遇到耗时的操作(如 I/O 操作)时,它会将这些操作交给浏览器或 Node.js 运行时处理,并继续执行事件循环中的其他任务。这样可以确保主线程不会被阻塞,保持程序的响应性和交互性。
宏任务和微任务
事件队列中的任务分为两种类型:宏任务和微任务。
- 宏任务包括常见的 JavaScript 代码、setTimeout、setInterval 等。这些任务会被添加到事件队列的末尾,等待事件循环执行。
- 微任务包括 Promise 的回调、process.nextTick (Node.js) 等。这些任务会被添加到当前宏任务执行完成后的微任务队列中,优先于下一个宏任务执行。
事件循环在执行一个宏任务后,会检查并执行所有的微任务队列,然后再执行下一个宏任务。这种机制确保了微任务可以更快地得到执行,提高了程序的响应性。
回调函数
当耗时的操作完成时,浏览器或 Node.js 运行时会触发一个事件,并将相应的回调函数放入事件队列中。
事件循环会检测到这个回调函数,并从队列中取出执行它。这就实现了非阻塞式的异步操作,防止单线程的 JavaScript 被耗时的操作阻塞。
实际应用
这种事件循环、宏任务和微任务的机制在 JavaScript 编程中广泛应用:
- 网页交互: 在网页开发中,我们经常使用回调函数来处理用户交互,如点击事件、表单提交等。这些操作通常不会阻塞主线程,确保页面保持高度响应性。
- 网络请求: 当发送 AJAX 请求时,我们通常会使用回调函数来处理服务器的响应。这样可以确保在请求过程中,用户仍然可以与页面进行交互。
- 定时器:
setTimeout()和setInterval()函数也利用了事件循环的机制。它们会将定时器任务添加到事件队列中,等待执行。 - Node.js 中的异步操作: Node.js 也是基于事件循环和回调函数的机制实现异步操作,如文件 I/O、数据库查询等。这确保了 Node.js 应用程序可以高效地处理大量并发请求。
此外,还有一些其他的应用场景:
- 事件驱动模型: JavaScript 的事件循环机制很适合实现事件驱动模型,这在 Web 开发和 Node.js 中广泛应用。
- 错误处理: 当异步操作发生错误时,可以通过回调函数的方式进行错误处理,避免整个程序崩溃。
- 流式处理: 在处理大量数据时,可以使用流的方式进行异步处理,提高性能和内存利用率。
相关文章:
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 项目的主要使用场景及缺点 使用场景: 缺点: 二、在实际项目中的应用 …...
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、反向代理产生的背景 单个服务器的处理客户端(用户)请求能力有一个极限,当接入请求过多时&#…...
SQL Server数据库标记为SUSPECT的紧急修复指南:从单用户到多用户模式的完整恢复流程
1. 数据库被标记为SUSPECT的常见原因 数据库突然变成SUSPECT状态,就像电脑突然蓝屏一样让人措手不及。我遇到过最典型的情况是机房突然断电,导致SQL Server没来得及完成所有事务就强制关闭了。这种情况下,数据库引擎为了保护数据完整性&#…...
SAP BTP新手避坑指南:从零开始创建Directory和Subaccount(附Region选择建议)
SAP BTP新手避坑指南:从零开始创建Directory和Subaccount(附Region选择建议) 第一次登录SAP BTP Cockpit时,面对Global Account、Directory、Subaccount的层级关系,很多新手会感到无从下手。这就像刚拿到一套乐高积木却…...
破局MIDI控制困境:SendMIDI让命令行成为音乐创作的神经中枢
破局MIDI控制困境:SendMIDI让命令行成为音乐创作的神经中枢 【免费下载链接】SendMIDI Multi-platform command-line tool to send out MIDI messages 项目地址: https://gitcode.com/gh_mirrors/se/SendMIDI 在数字音乐制作的世界里,MIDI&#x…...
C#桌面开发选型指南:OpenTK vs SharpGL,在.NET Framework 4.7/Winform中谁更香?
C#桌面开发选型指南:OpenTK vs SharpGL在WinForm中的深度对决 当我们需要在.NET WinForm项目中集成3D图形功能时,OpenTK和SharpGL这两个库常常成为开发者纠结的选择。作为在.NET生态中封装OpenGL的两种主流方案,它们各有特色,适用…...
动态对抗Zygisk-IL2CppDumper:Unity游戏安全新策略
1. 认识Zygisk-IL2CppDumper的攻击原理 如果你开发过Unity游戏,一定对IL2CPP不陌生。这是Unity官方推荐的脚本后端,它把C#代码转换成C代码再编译为本地机器码,相比Mono模式确实安全不少。但最近一年,一个叫Zygisk-IL2CppDumper的工…...
Java网络编程实战:从零实现一个支持视频通话的聊天室
最近在学习Java网络编程,恰好之前写过一个基于TCP的多人聊天室,一直想给它加上视频通话功能。经过几天的折腾,终于把UDP视频流和TCP信令成功整合到了一起。这篇文章会完整记录开发过程、踩过的坑以及最终的代码实现 一、项目背景与目标 原有…...
OpenClaw 生态全景图——AI 助理如何改变工作方式
OpenClaw 生态全景图——AI 助理如何改变工作方式摘要:2026 年,AI 助理从"玩具"变成"工具"。本文带你了解 OpenClaw 生态系统的完整布局,看它如何连接微信、飞书、钉钉等主流平台,以及企业和个人如何利用它提…...
Opyrator UI设计技巧:5个Streamlit自动生成界面教程
Opyrator UI设计技巧:5个Streamlit自动生成界面教程 【免费下载链接】opyrator 🪄 Turns your machine learning code into microservices with web API, interactive GUI, and more. 项目地址: https://gitcode.com/gh_mirrors/op/opyrator Opyr…...
避坑指南:CentOS虚拟机重启报rdsosreport.txt错误时,为什么xfs_repair有时需要-L参数?
CentOS虚拟机XFS文件系统修复实战:为什么-L参数是最后的救命稻草? 当你深夜加班部署服务,突然虚拟机异常断电,重启后屏幕上赫然出现"generating /run/initramfs/rdsosreport.txt"的报错——这个场景足以让任何Linux管理…...
AltStore终极指南:非越狱iOS设备安装第三方应用的完整方案
AltStore终极指南:非越狱iOS设备安装第三方应用的完整方案 【免费下载链接】AltStore AltStore is an alternative app store for non-jailbroken iOS devices. 项目地址: https://gitcode.com/gh_mirrors/al/AltStore 还在为苹果App Store的限制而烦恼吗&am…...
