当前位置: 首页 > 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. 流式处理: 在处理大量数据时,可以使用流的方式进行异步处理,提高性能和内存利用率。

http://www.lryc.cn/news/427792.html

相关文章:

  • Shell脚本发送邮件的详细步骤与配置方法?
  • 如何把Phalcon 集成到PhpStorm里面
  • python从入门到精通:循环语句
  • Codeforces Round 965 (Div. 2)
  • Win10下载安装Mysql服务
  • MVVM(Model-View-ViewModel)架构模式
  • C#MVC返回DataTable到前端展示。
  • HttpUtils工具类(二)Apache HttpClient 5 使用详细教程
  • Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)
  • 遥感之常用各种指数总结大全
  • 【C++】C++11新增特性
  • 【LeetCode每日一题】——662.二叉树最大宽度
  • 第二十三节、血量更新逻辑的实现
  • Spring Authorization Server 认证服务器搭建
  • 秋招突击——8/15——知识补充——垃圾回收机制
  • 【iOS】UITableViewCell的重用问题解决方法
  • 开发一个微信小程序商城需要哪些技术栈
  • 望繁信科技荣膺上海市浦东新区博士后创新实践基地称号
  • Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)
  • Ubuntu20.4 系统安装后无wifi图标
  • 牛客网SQL进阶135 :每个6/7级用户活跃情况
  • SQLite3使用接口写入二进制文件
  • 在复杂的数据库架构中,如何优化 SQL 查询以提高性能和减少资源消耗?
  • 【HarmonyOS】端云一体化初始化项目
  • LLM之KG:利用大语言模型(LLM)对文本语料提取概念和概念之间的语义关系进而实现自动构建知识图谱
  • Spring Security 6如何使用?
  • PyTorch深度学习快速入门教程--学习笔记
  • SQLALchemy 分组过滤、子查询
  • 华为od(D卷) 环中最长子串/字符成环找偶数LOX
  • 机器学习--常见算法总结