快速学习nodejs系列:四、nodejs特性1--单线程

子明
• 阅读 2009

nodejs特性1--单线程

说明:也许你会问,为什么还不安装nodejs?还不写代码?还不讲模块?前面我说过,不会一来就hello world。而是会先跟大家讲讲nodejs的特点,只有大家明白、理解nodejs的特点,在后面的模块学习中,会有种豁然开朗的感觉,也会更加明白为什么nodejs会这样设计;比起一上来就看文档、写代码更加事半功倍;比起代码层面的东西,原理更为重要!

在php,java语言中,会为每一个客户端连接都创建一个新的线程。以php(php-fpm、单进程单线程)为例,每一个php-fpm工作线程大概消耗20M内存,一个8G的服务器,大概同时支持400个左右客户端连接。要想支持更加多的客户端连接,只能增加服务器数量,这样一来硬件的费用成本就上来了。

在nodejs始终只有唯一一个线程,它不为每一个客户端的连接新开线程。据某些测试,一个8G内存的服务器同时支持4万了连接。nodejs通过自己内部事件机制、异步I/O,在宏观上达到并行。

例子说明:
如一个任务中有3个线程;
在多线程中(图1),它3个线程是同时并行的,但由于每个线程中都有I/O操作,都要等阻塞I/O完成后才能进行下面的程序。

快速学习nodejs系列:四、nodejs特性1--单线程
图1

在Nodejs单线程中,首先会把所有要执行的线程放到“事件栈”中,在开始执行第一个线程后,遇到I/O时,会马上把当前的I/o操作放到事件栈中并开始执行线程2;当线程1的I/O执行完成后,程序会回到线程1,并执行线程1的程序2;当线程2中遇到I/O,也会放到事件栈中;程序转而去处理其他;就是这样的循环,让程序达到并行效果,这个线程的利用率是100%的。

快速学习nodejs系列:四、nodejs特性1--单线程
图2

如果你还不明白的话,我们可以用生活的例子来进一步说明:餐厅和服务员的关系;多线程--招很多个服务员,每个服务员干特定的活(点菜、冲茶、收桌子),干完自己的活后可以休息;而单线程--只招了一个服务员,所有的活都有他自己一个人干,干什么他自己决定,甚至点菜干到一半,去把冲茶干完后,再回来继续点菜也可以。

另外,单线程中,操作系统没有创建、销毁线程的时间开销。
单线程缺点:如果有用户造成线程崩溃,那个整个系统都崩溃了。(不过nodejs很难崩溃,会有相应的错误事件处理)

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
徐小夕 徐小夕
4年前
30分钟教你优雅的搭建nodejs开发环境及目录设计
前言笔者最近在工作之余,一直在做数据可视化和nodejs方面的研究,虽然之前的web工作中接触过nodejs和可视化相关的内容,但是没有一个系统的总结和回顾,所以为了更深入的研究和复盘我的nodejs和数据可视化之路,笔者将会花两个月的时间,做一个彻底的复盘.Node.js是一个事件驱动I/O服务端JavaSc
徐小夕 徐小夕
4年前
30分钟教你优雅的搭建nodejs开发环境及目录设计
前言笔者最近在工作之余,一直在做数据可视化和nodejs方面的研究,虽然之前的web工作中接触过nodejs和可视化相关的内容,但是没有一个系统的总结和回顾,所以为了更深入的研究和复盘我的nodejs和数据可视化之路,笔者将会花两个月的时间,做一个彻底的复盘.Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,
徐小夕 徐小夕
4年前
复盘node项目中遇到的13+常见问题和解决方案
笔者之前陆陆续续接手过几个nodejs项目,也参与过几个有点意思的nodejs开源项目,最近把其中遇到的一些问题和解决方案做一个梳理,避免大家继续踩坑.话不多说我们开始吧1.window和mac下设置NODE_ENV变量的问题我们都知道在前端项目中会根据不同的环境变量来处理不同的逻辑,在nodejs中也一样,我们需要设置本地开发环境,测
徐小夕 徐小夕
4年前
如何使用nodejs自动发送邮件?
之前用Nodejs做了很多服务端模块,最近抽空复盘一下,接下来笔者将介绍如何使用Nodejs来自动向用户发送邮件.笔者将详细介绍自动发送邮箱的实现方案,以及通过一个实际的案例来带大家掌握使用nodejs自动发送邮件,最后会介绍一些实际的应用场景,来加深对该方案的理解,达到学以致用的目的.实现方案实现自动发送邮件笔者采用了基于Nod
Stella981 Stella981
3年前
CabloyJS v4.0.0支持工作流引擎及更多 🎉
截至2020年12月21日冬至,花了近5年时间作出最小可用NodeJS开源全栈框架,这就是CabloyJSV4.0.05年,90个模块,30万行代码,5400次提交(Commits),开启NodeJS全栈开发的全新体验CabloyJSV4.0.0主要完成了以下特性采用lerna将cab
Stella981 Stella981
3年前
Node.js学习路线图
Node.js学习路线图从零开始nodejs系列文章(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.fens.me%2Fseriesnodejs%2F),将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs
Stella981 Stella981
3年前
Node JS World
NodeJSWorldEnvironmenttestedonUbuntuInstallnvm/node/npm/yarnnvm:nodeversionmanagernode:nodejs
Wesley13 Wesley13
3年前
mongo
搭建调试环境,调试CVE201910758漏洞,学习nodejs沙箱绕过,以及nodejs远程调试。目前网上关于该漏洞的基于docker的远程调试分析写的很泛,本文从初学者角度分析调试漏洞成因,特别是在chrome浏览器调试nodejs上花了点篇幅。0x01认识mongoexpressmongoexpress是一个Mong
Stella981 Stella981
3年前
NodeJs学习一NodeJs初识
一、前言按照惯例,先扯淡,就因为这货,现在才有了各大公司招聘的全栈工程师,正是因为它,让以前只会写前端的人也能写起后端服务器代码来了。所以呢,你招一个会NodeJs的前端,它都能把后端干了,一个人干了两个人的事,你说哪个公司不想要。但是我还是要同情一下前端的兄弟们,真是苦了你们了,以前你们只是写页面就完了,现在还得写后台,再加上各种前端框架,什么
Python进阶者 Python进阶者
1年前
运行js文件,会弹出一个python解释器的界面,怎么解决呢?
大家好,我是皮皮。一、前言前几天在Python白银交流群【菜🐤】问了一个Python环境配置的问题,一起来看看吧。问题如下:问题:下载安装nodejs,然后在pycharm专业版里面也下载了nodejs的插件,配置好运行路径后,运行js文件,会弹出一个p