ajax 高并发请求,理解node.js处理高并发请求原理

很少分享技术文章,写的不好的地方请大家多多指教,本文是自己对于node.js的一些见解,如有纰漏请在评论区交流。

高并发策略

通常高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程,使用同步 I/O,系统通过线程切换来弥补同步I/O调用的时间开销。

但是当并发请求越多创建的线程也越多,这样创建、销毁线程以及在线程间切换所需的开销也是非常大的。

Node.js采用了单线程模型来处理,不会为每个请求分配一个线程,而是用一个主线程处理所有的请求,然后对I/O操作进行异步处理,避开了创建、销毁线程以及在线程间切换所需的开销和复杂性。所以这就是为什么node.js适合IO密集型任务而不适合计算密集型任务

node.js 异步IO

异步IO是指操作系统提供的IO(数据进出)的能力,比如:磁盘的读写,DNS的查询,数据库的连接,网络请求的处理,等等;线程发出IO操作指令,然后就可以去做别的事情了(线程不需要等待),所有操作完成后再执行回调。

libuv 的IO线程池

nodejs中的异步I/O是通过底层的libuv提供的多线程的线程池来完成的。所以Node.js 的单线程仅仅是指 JavaScript 运行在单线程中,而并非 Node.js 是单线程。

IO线程执行IO操作时,会调用一个系统函数,生成一个请求包向内核传递,内核知道将这个I/O操作发送给哪个硬件设备。异步IO同时会传入一个回调函数随着请求包传递给设备驱动程序,然后IO线程返回线程池执行下一个IO事件。当异步I/O请求完成时,设备驱动程序就会生成一个I/O完成包,会由IO线程提取完成I/O的请求包,并将之前的回调函数推入node.js的task Queue中,等待事件循环将它推入主线程的执行栈执行。

node.js 事件循环(event loop)

8c2eb296ebcd47fe85ff17549ecfdbc4.png

每当我们运行一个node.js程序时,就会自动创建一个主线程。这个线程是执行js代码的唯一地方。在主线程内部,会生成了一个叫事件循环的东西。这个循环的作用是调度我们主线程在哪个时间点应该执行的操作。

运行程序后不会立即生成事件循环。它会在整个程序执行完后运行

Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。事件就是主题,注册到这个事件的回调函数就是观察者

通过上图简单讲一下node.js的事件循环,当程序执行到异步事件时,比如计时器(setTimeout等),promise, io请求等,会将事件推入事件队列。

如果是IO操作,事件循环会将事件推给异步IO线程池,完成返回回调函数到task Queue, 非IO操作(setTimout等)会调用操作系统API执行,然后返回到callback quque. 然后根据事件循环的不同阶段从queue中取出callback函数推入主线程的执行栈中执行。

至于事件循环的阶段不是本文的重点,可以参考官网event loop指南这里就不细讲了。

如果有疑问请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

abaqus生成adams柔性体_基于ADAMS 的大型反铲挖泥机加装破碎锤 结构动力学分析

刘 斌 徐沪萍 王 磊武汉理工大学物流工程学院 武汉 430063摘 要:以配备液压破碎锤的反铲挖泥船反铲挖泥机为研究对象,简单介绍加装液压破碎锤方案,然后运用动力学理论和相关的动态仿真软件,通过建立反铲挖泥机的刚柔耦合模型&…

rust加载不进去服务器eac_基于腾讯云的 Rust 和 WebAssembly 函数即服务

腾讯云云函数 (SCF) 已经支持十多种编程语言和运行时框架。腾讯云最近发布的 SCF custom runtime(自定义运行时)更进一步 —— SCF 现在可以支持用任何编程语言编写的函数。本文将介绍如何在云函数 SCF 中运行用 Rust 编写的 WebAssembly 函数。我们先介…

ceb怎么转换成word_PDF怎么转换成Word?分享免费转换技巧!

PDF怎么转换成Word?pdf格式无法编辑众所周知的事,但如果我们需要将其进行编辑使用的话,就需要将pdf格式转换成word格式。可是怎么将pdf转换成word一直是件令人头疼的事!所以今天小编给大家分享几个pdf转word免费转换技巧&#xff…

[FZYZOJ 1038] 隧道

P1038 -- 隧道 时间限制:1000MS 内存限制:65536KB Description 一座小镇正在着手建造自己的地铁线路网。小镇坐落在许多小岛上,小岛之间通过隧道或者桥梁连接。地铁就在这些已有的桥梁和隧道的基础上建成。由于地铁主要是在地下&#xf…

7极限精简版64位_DNF:国服更新64位客户端深度体验,真的有如此丝滑吗?

DNF最新最快资讯,最全最细攻略,尽在骑乌龟的蜗牛12年,地下城的游戏客户端终于获得了升级,从32位更新到了64位,关于更新带来的游戏好处大家应该都在很多地方看过,而国服正式服也终于在8.20版本的更新中将客户…

隐藏a标签seo_让黑帽都惊了,远离百度惩处的seo技术

一、什么是黑帽SEO黑帽SEO,即SEO作弊,是指为了提高网站在搜索引擎中展现机会和排名的目的,欺骗搜索引擎的行为“黑帽”技术与搜索引擎算法相排斥,是搜索引擎不允许的。一旦被发现使用“黑帽”技术,那么网站排名会被降低…

前端学习(1501):一次帮别人解决问题的案例

超开心 只能添加姓名 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </…

mysql 加字段_MySQL8.0大表秒加字段,是真的吗?

前言&#xff1a;很早就听说 MySQL8.0 支持快速加列&#xff0c;可以实现大表秒级加字段。笔者自己本地也有8.0环境&#xff0c;但一直未进行测试。本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作。1.了解背景信息表结构的变更是业务运行过程中比较常见的需求之一&…

SQLServer学习笔记系列4

一.写在前面的话 好多天没有记录sql学习笔记了&#xff0c;要坚持下去&#xff0c;坚信每一点的进步都是为在积蓄力量。今天看到一幅图&#xff0c;特此分享出来。 通过这幅图&#xff0c;我看到的是每人站在自己的角度看问题&#xff0c;感受是不一样的&#xff0c;就如同学习…

随便选一张扑克牌_扑克牌魔术手法教学,简单易学的纸牌魔术,三分钟让你成为大师...

标签&#xff1a; 魔术手法 扑克牌魔术 魔术技巧教学 纸牌魔术揭秘所有的纸牌魔术家都知道怎样假装把一张牌塞进牌堆&#xff0c;然后从顶部翻出来来让观众吃惊。这个技巧用来练习手速、手指灵敏度、适时分散观众注意力和表演艺术绝对是不可或缺。这里就给大家介绍一下吧&#…

Android项目使用Eclipse进行单元测试

Android项目如果每次都整个调试的话&#xff0c;要加载UI&#xff0c;会等很长时间。所以单元测试就显得很方便了。 要进行单元测试&#xff0c;首先得修改下AndroidManifest.xml文件。在Instrument标签里点右侧的Add按钮。然后在弹出的窗口双击 Instrument。然后在右侧就会多出…

mysql union 用法 update_mysql---union的用法

union的作用很简单用来合并两条sql的结果集语法: SQL1 UNION SQL2现有一张价格表要求&#xff1a;求出价格低于2000和价格高于3000的商品&#xff0c;不能用or和not between……and思路&#xff1a;我们可以先求出低于2000的商品得到结果集1再求出高于3000的商品得到结果集2再利…

Mybatis多对多,复杂增删改查(特殊需求循环插入,分组查询)

2021.8.31 从25号开始练习复杂的mybatis多对多&#xff0c;从设计数据库思路到实现需求功能转移到实体项目中 1.之前很少看过字符转换的详细内容从今往后会注意字符串转换此项目为转数组&#xff08;date&#xff09;实体项目会有UUID生成的字符串 2.在添加时如果原表设计的首个…

kubernetes mysql pxc_K8S使用operator部署和管理Percona - PXC集群

概述pxc为mysql的一种集群模型&#xff0c;我们结合operator和k8s 完成pxc的部署和扩容硬盘使用local卷&#xff0c;如何管理local卷请翻阅 我的另一篇文章https://www.jianshu.com/p/bfa204cef8c0英文文档详情 https://percona.github.io/percona-xtradb-cluster-operator/con…

Springboot递归树(需求返回List树状结构数据)

一、本主的应用场景 部门里面有一个属性是当前部门的上级部门&#xff0c;而当前部门又会有下级部门&#xff0c;下级部门还有下级部门&#xff0c;这就形成了一个向下无限循环&#xff0c;呈现出树状结构。 二、认识JSONObject JSONObject只是一种数据结构&#xff0c;可以理…