JavaScript单线程模型

JavaScript 并发模型与事件循环:单线程的异步魔法 JavaScript 的并发模型基于事件循环,通过调用栈、任务队列(宏任务和微任务)来管理任务的执行顺序。尽管 JavaScript 是单线程的,但事件循环和非阻塞 I/O 机制使得它能够高效地处理并发任务。理解事件循环的机制,不仅有助于编写高效的异步代码,还能帮助我们避免潜在的性能问题。希望本文能为你揭开 JavaScript 并发模型的神秘面纱,让你更好地掌握这门语言的异步魔法! 阅读详情

JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事,前面的任务没做完,后面的任务只能等着。

1. 为什么JavaScript是单线程的呢?

  • 这主要与JavaScript用途有关。它的主要用途是与用户互动,以及操作DOM。如果JavaScript是多线程的,会带来很多复杂的问题,假如 JavaScript有A和B两个线程,A线程在DOM节点上添加了内容,B线程删除了这个节点,应该是哪个为准呢? 所以,为了避免复杂性,所以设计成了单线程。
  • 虽然 HTML5 提出了Web Worker标准。Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。但是子线程完全受主线程控制,且不得操作DOM。所以这个并没有改变JavaScript单线程的本质。一般使用 Web Worker 的场景是代码中有很多计算密集型或高延迟的任务,可以考虑分配给 Worker 线程。
  • 但是使用的时候一定要注意,worker 线程是为了让你的程序跑的更快,但是如果 worker 线程和主线程之间通信的时间大于了你不使用worker线程的时间,结果就得不偿失了。

2. 浏览器内核中线程之间的关系

  • GUI渲染线程和JS引擎线程互斥
    • js是可以操作DOM的,如果在修改这些元素的同时渲染页面(js线程和ui线程同时运行),那么渲染线程前后获得的元素数据可能就不一致了。
  • JS阻塞页面加载
    • js如果执行时间过长就会阻塞页面

3. 浏览器是多进程的优点

  • 默认新开 一个 tab 页面 新建 一个进程,所以单个 tab 页面崩溃不会影响到整个浏览器。
  • 第三方插件崩溃也不会影响到整个浏览器。
  • 多进程可以充分利用现代 CPU 多核的优势。
  • 方便使用沙盒模型隔离插件等进程,提高浏览器的稳定性。

4. 进程和线程又是什么呢

进程(process)和线程(thread)是操作系统的基本概念。

  • 进程是 CPU 资源分配的最小单位(是能拥有资源和独立运行的最小单位)。
  • 线程是 CPU 调度的最小单位(是建立在进程基础上的一次程序运行单位)。

由于每个进程至少要做一件事,所以一个进程至少有一个线程。系统会给每个进程分配独立的内存,因此进程有它独立的资源。同一进程内的各个线程之间共享该进程的内存空间(包括代码段,数据集,堆等)。

进程可以理解为一个工厂不不同车间,相互独立。线程是车间里的工人,可以自己做自己的事情,也可以相互配合做同一件事情。

5. 任务队列

  • 单线程就意味着,所有任务都要排队执行,前一个任务结束,才会执行后一个任务。
  • 如果一个任务需要执行,但此时JavaScript引擎正在执行其他任务,那么这个任务就需要放到一个队列中进行等待。等到线程空闲时,就可以从这个队列中取出最早加入的任务进行执行(类似于我们去银行排队办理业务,单线程相当于说这家银行只有一个服务窗口,一次只能为一个人服务,后面到的就需要排队,而任务队列就是排队区,先到的就优先服务)

注意: 如果当前线程空闲,并且队列为空,那每次加入队列的函数将立即执行。

为什么会有任务队列? 由于 JS 是单线程的,同步执行任务会造成浏览器的阻塞,所以我们将 JS 分成一个又一个的任务,通过不停的循环来执行事件队列中的任务。

js线程高级:09、线程机制与事件机制(进程与线程、浏览器内核、定时器引发思考、JS是单线程、事件循环模型、Web Workers) 本文探讨了JavaScript的进程与线程、浏览器内核、定时器机制以及事件循环模型。主要内容包括:1)浏览器多进程架构与JS单线程特性;2)定时器执行的不确定性及其在主线程执行的特性;3)JS采用单线程模式的原因(避免DOM操作冲突);4)事件循环模型的执行流程(先同步后异步)。通过代码示例展示了定时器延迟、alert阻塞等现象,验证了JS的单线程本质。最后提到Web Workers可实现多线程,但受限于不能操作DOM。 阅读详情

相关推荐

地平线旭日X3派(RDK X3)从开箱到联网:新手避坑指南

本文为地平线旭日X3派(RDK X3)新手提供从开箱到联网的完整避坑指南。详细讲解了硬件识别、系统镜像烧录、串口调试(波特率921600)、有线/无线网络配置以及SSH/VNC远程访问等关键步骤,帮助开发者快速搭建稳定的开发环境,为后续AI应用部署扫清障碍。

weixin_29174385的博客 937

JavaScript进阶教程 - JavaScript的单线程模型

JavaScript的单线程模型是指在任何给定的时间点,JavaScript引擎只能执行一个任务。这意味着JavaScript代码的执行是线性的,一次只能执行一段代码。这个特性对于理解JavaScript中事件处理、异步编程和并发模型非常关键。

r081r096的博客 1376

【CSP-J/S初赛知识点整理】

CSP-J/S初赛知识点整理

qq_43884946的博客 1万+

JavaScript中的异步和单线程

JavaScript 是一门单线程语言,它的执行顺序是按照代码书写的顺序依次执行的。但是随着 Web 应用的复杂性增加,我们需要进行网络请求、定时器、事件处理等异步操作,这时候单线程的执行方式就无法满足我们的需求了。为了解决这个问题,JavaScript 引入了异步编程的概念,使得 JavaScript 可以同时处理多个任务,提高程序的执行效率。

tyxjolin的专栏 1006

具身智能落地实战:制造业、物流与电力的工业级方案设计

具身智能是一种融合感知、推理与物理执行的智能范式,其核心在于构建具备因果建模能力、多模态闭环反馈和实时动作规划的行动主体。区别于通用AI或传统自动化,它依托多模态大模型、高精度力觉/触觉传感及Sim2Real仿真技术,实现对真实物理环境的深度理解与自适应交互。技术价值体现在可解释性决策、毫秒级跨模态协同与零停机容错能力,已规模化应用于制造业质检、物流破损鉴定、电力绝缘子巡检等强约束工业场景。本文聚焦‘行业应用方案解决方案’这一高频搜索需求,系统拆解从工位筛选、分层架构设计到72小时现场交付的全链路工程方法论

weixin_30952479的博客 300

Shopee滑块验证码太刁钻?手把手教你用Python+Playwright绕过弧形验证(附影刀RPA接入代码)

本文详细介绍了如何使用Python和Playwright结合SadCaptcha第三方服务高效破解Shopee平台的弧形滑块验证码,并集成到影刀RPA工作流中。该方案开发周期短、准确率高(>90%),特别适合跨境电商自动化操作,已在实际项目中验证成功。

weixin_29284657的博客 567

【前端面试】JavaScript-异步原理:单线程模型、消息队列、setTimeout、事件循环、Promise及实现、await/async、面试题

参考文章: [1]JavaScript 单线程模型 - W3Cschool [2]并发模型与事件循环 - MDN [3]JavaScript中的事件循环与消息队列 [4]一篇搞定(Js异步、事件循环与消息队列、微任务与宏任务)- 知乎 [5]终于明白的JS——消息队列与事件循环 - 优快云 [6]Promise - MDN [7]then - MDN [8]catch - MDN [9]Promise实现原理(附源码)- 掘金 [10]xieranmaya/Promise3 - Github [11]as

SDUzzy的博客 819

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

JavaScript 线程模型

先出一道题: console.log('a'); setTimeout(function (){     console.log('b'); },1000); console.log('c'); 如果你给出的结果是:a c b,且明白为什么,此篇文章可以跳过。 -------------------------------------------...

weixin_30297281的博客 184

优化算法 | 赏金猎人优化算法(Bounty Hunter Optimizer, BHO)及其在多无人机移动边缘计算与路径规划中的应用(附matlab源代码)

移动边缘计算(Mobile Edge Computing, MEC)通过将计算资源下沉至网络边缘,有效解决了物联网终端设备计算能力不足与能耗受限的问题。无人机(Unmanned Aerial Vehicle, UAV)因其高机动性、灵活部署和广域覆盖等优势,被广泛用作MEC的移动服务器平台。多无人机辅助MEC系统的核心优化问题在于:如何在满足任务处理时延约束和无人机能量限制的前提下,联合优化无人机的三维飞行轨迹、任务卸载决策与计算资源分配,以最小化系统总能耗或最大化任务完成效率。

尘世冰封的专栏 224

杰理AC695N系列芯片红外遥控按键使用教程

本文介绍了杰理AC695N芯片红外按键功能的配置和使用方法。主要内容包括:硬件连接说明(红外接收头接线至GPIO口)、软件配置(使能红外功能并设置接收引脚)、按键映射表修改(原始键值到逻辑按键的转换)以及按键扫描参数调整(消抖、长按时间等)。重点展示了三级映射机制,指导如何根据实际遥控器键值修改映射关系,实现不同模式下(蓝牙/音乐/FM)的自定义按键功能。最后提供了调试方法,可通过串口打印查看遥控器原始键值。

qq_42014563的博客 1463

JavaScript 线程:处理高并发任务的必备知识(上)

JavaScript 线程是指 JavaScript 代码在执行过程中所占用的线程。在 JavaScript 中,所有的代码都是单线程执行的,也就是说,每个 JavaScript 执行上下文(例如,浏览器中的window对象)都会占用一个线程。当 JavaScript 代码执行时,浏览器会自动分配一个线程来处理代码,直到代码执行完毕。JavaScript 线程的特点是,当 JavaScript 代码执行时,浏览器会暂停其他代码的执行,直到 JavaScript 代码执行完毕。

你若盛开,清风自来 1201

日常工作记录---在虚拟机中进行slam建图

   今天是10月24号,首先祝各位程序员们节日快乐!!!    最近一周由于实习的原因,对ROS的探索学习,停滞了一段时间,所以今天也就没什么大的进展,本篇文章仅仅记录一下,我在虚拟机中进行slam建图可行性验证的过程,本篇文章同样使用古月学院《如何在Gazebo中实现阿克曼转向车的仿真》的课程资料来进行验证    下面各条之间并没有严格的顺序关系,每一条都是独立的,都是我在验证过程中的经验或者记录:    1、在运行roslaunch bringup racecar_gazebo_rviz.lau

慕羽★的博客 4828

【前端知识】JS单线程模型深入解析

JavaScript 单线程模型深度解析:从浏览器到Node.js的核心机制 本文深入剖析了JavaScript单线程模型的设计原理和实现机制。作为浏览器脚本语言,JavaScript采用单线程避免DOM操作竞态条件,通过事件循环机制实现非阻塞I/O。核心组件包括调用栈、Web APIs、任务队列和微任务队列,执行顺序遵循"同步代码→微任务→宏任务"的规则。Node.js使用libuv库实现差异化事件循环,分为定时器、轮询等多个阶段。为解决性能瓶颈,文章介绍了Web Workers、Sh

wendao76的专栏 1397

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【JS】定时器和单线程模型

定时器 添加定时器功能 setTimeout() setInterval() 两者相同点 用法相同 — 两者不同点 隔一段时间执行 每隔一段时间执行 取消定时器功能 clearTimeout() clearInterval() 用法 function consoleLog(val) { console.log(val); } function conLog(){...

Zhouzhouzzz冲鸭 283

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

*解释Node.js的单线程模型

Node.js 在近年来成为了前端开发者们热衷的工具,尤其在构建高性能网络应用方面展现出了巨大的优势。Node.js以其单线程的构架闻名,这也是其高效处理并发需求的核心原因。本文将通过深入分析Node.js的单线程模型,讲解其工作原理,并提供一些示例代码,帮助你更好的理解这一概念。

有我更精彩的博客 1186

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅析 Node.js 单线程模型

总结笔记:对于每个用户请求,由主线程接收并存放于一个事件队列中(不做任何处理),当无请求发生时,即主线程空闲,主线程开始循环处理事件队列中的任务: 对于非阻塞JS程序: 1、若某事件需要I/O操作,则主线程发出I/O请求,然后继续执行,由底层的程序实现I/O并返回I/O数据(底层程序是多线程的,JS是单线程的),底层I/O线程处理完后将该事件重新放入事件队列并释放当前线程; ...

aoyou3037的博客 169

nodejs---浅析 Node.js 单线程模型

浅析 Node.js 单线程模型Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程、高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发和异步 I/O?本文将围绕这个问题来探讨 Node.js 的单线程模型 。1、高并发策略一般来说,高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程...

一涵的博客 1793

JavaScript单线程运行机制与并发模型

一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事。具体地,一个window对应一个JavaScript线程。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两...

拈花的专栏 3327

【编程语言线程模型】单线程 vs 多线程,为什么JavaScript是“单线程”的?

本文深入探讨了单线程和多线程编程语言的区别与特点。单线程语言如JavaScript采用事件循环机制实现伪并发,适合I/O密集型任务,简单高效但可能阻塞;多线程语言如Java、C++则支持真并行计算,适合CPU密集型任务,但复杂度高且需处理线程同步问题。文章通过实例代码和对比表格,分析了两种模型的优缺点及适用场景:单线程适合Web开发,多线程更适用于高性能计算。最后指出编程语言的选择应基于具体需求,并展望了协程等未来发展趋势。

深耕CV 1049

深入浅析Node.js单线程模型

Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程、高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这个问题来探讨Node.js的单线程模型: 1、高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的...

aoqiaotan2763的博客 377

关于js中的单线程和异步事件同操作系统的生产者消费者模型的理解

今天学习js,用到了window下面的setTimeout和setInterval两个方法有一些理解。这里用到了操作系统原理里面的生产者和消费者模型。这里有以下几个观点: 1、js引擎执行js代码的时候是单线程的,即同一时刻只会有一个进程执行JS代码 2、JS中的异步通信和定时是由另外的线程实现的,脱离js线程上下文 3、js执行的操作类似于生产者和消费者模型 以下图是说明了js引

itcast_troops的博客 1238

浅谈node.js单线程模型

Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程、高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发和异步 I/O?本文将围绕这个问题来探讨 Node.js 的单线程模型 。 1、高并发策略 一般来说,高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程,使用同步 I/O,系统

皮皮王的专栏 370

Javascript学习笔记(单线程模型)

单线程模型 来自《JavaScript 标准参考教程(alpha)》,by 阮一峰 目录 含义 消息队列 Event Loop 含义 单线程模型指的是,JavaScript只在一个线程上运行。也就是说,JavaScript同时只能执行一个任务,其他任务都必须在后面排队等待。 注意,JavaScript只在一个线程上运行,不代表Java

竹官阁 428
上一篇: Chrome 打开一个页面需要启动多少进程?分别有哪些进程?
下一篇: 浏览器架构
小码哥・Martin
博客等级 码龄18年 10粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小码哥・Martin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值