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完成后才能进行下面的程序。


图1

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


图2

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

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

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

  1. 从零开始nodejs系列文章-nodejs到底能干什么

    Node.JS 学习路线图 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的 Java ...

  2. 【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看

    上一篇文章学习了如何使用GDB数据断点进行内存监测:[软件开发底层知识修炼]十五 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变 本篇文章继续上一篇文章的学习:如何使用GDB进行函数调用栈 ...

  3. C++学习笔记系列四

    1.一般来说,类的私有成员只能在类的内部访问,类外的函数是不能访问它们的. 但是,可以将一个函数定义为类的友元函数,这时该函数就可以访问该类的私有成员了. 友元之普通函数(非成员函数,自由函数) 友元 ...

  4. Android学习笔记系列四2 —— Activity的生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 启动一个Activity 使用startActivity(Intent intent). intent指定了你想要启动的act ...

  5. 如何使用screen托管终端程序(妈妈再也不用担心我在家还不学习了系列四)

    前言 连接远程服务器后,刚开始还欣喜万分,用了几天后突然发现,what???网断了??我的程序就差那么一丢丢就跑完了!天哪!!!裂开了! 不要慌不要怕~~ 今天笔者就为大家带来了最高效.最简单的方法! ...

  6. 【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧

    上一篇文章学习了如何使用GDB进行函数调用栈的查看:[软件开发底层知识修炼]十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看 本篇文章是GDB调试快速学习系列的最后一篇.将综合前几篇文章做一 ...

  7. 用简易代码快速学习Python(八)

    本学习系列介绍: 本学习系列主要针对对编程略有了解或有其他语言基础并要进一步学习Python的同学,通过简易的代码快速入门掌握Python语言. 系列总目录: 用简易代码快速学习Python(一) 用 ...

  8. 快速学习nodejs系列:六、nodejs特性3--事件驱动

    事件驱动 上一节中,我们提到异步I/O:当I/O处理完毕后,nodejs是怎样知道I/O已经完成了呢?又是怎样去处理的呢?答案是:事件驱动(事件循环)机制. 事件驱动: 在nodejs中,当某个I/O ...

  9. 七天学会NodeJS (原生NodeJS 学习资料 来自淘宝技术团队)

    NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. ...

  10. 快速学习Java8新特性第七讲——Optional类

    在<快速学习Java8新特性第五讲--强大的Stream API>这一讲中,我就已经提及到了Optional类.在这一讲中,我将对其做一个更加细致的讲解. Optional类是什么? Op ...

最新文章

  1. Kali Linux安装谷歌浏览器
  2. 一道SQL面试题(行列互换)
  3. java split空字符_java split函数结尾空字符串被丢弃的问题
  4. [Selenium] CSS3 选择器
  5. socket编程简单Demo讲解及源码分享(C# Winform 内网)
  6. python 判断类是否有某个属性_python判断对象某个属性的方法有哪些
  7. 使用无锁队列(环形缓冲区)注意事项
  8. 现代科学家运用电极计算机,纳米技术在现代生活中的应用
  9. Ppmap - XSS扫描器
  10. 渗透测试工具——BurpSuite
  11. TuGraph安装与简单使用
  12. 蜗居中折射的三类男人
  13. 量化C++国产框架千星+ WonderTrader
  14. 删除鼠标右键菜单多余选项的方法
  15. css中关于旋转属性trtransform: rotate影响文字轻微变形的解决办法。
  16. OpenSSL下载安装
  17. 心理学中的催眠术怎么学[为本教育]
  18. Git实战技巧-多人协作开发出现代码冲突,如何合并代码
  19. 8个超好用的免费工具/软件/网站
  20. 启动mongodb数据库服务

热门文章

  1. laravel 分页使用
  2. 剑指offer-数值的整数次方
  3. asp.net MVC中form提交和控制器接受form提交过来的数据(转)
  4. jq方法中 $(window).load() 与 $(document).ready() 的区别
  5. 关于java中Exception异常
  6. maven的Lifecycle生命周期
  7. C++11 std::chrono库详解
  8. 使用T4模板动态生成邮件内容并储存到任意位置
  9. 性能测试工具Loadrunner使用之一(Virtual User Generato)
  10. bzoj 4300绝世好题