Nodejs既然这么流行就肯定有它的博大精深之处,自然不是我这还没入门的小白可以掌握的,我就简单说一下目前自己的理解程度。

一、单线程、非阻塞I/O、事件驱动

这是nodejs的三个特点。

单线程

Nodejs是单线程,和多线程相比:

优点:可以避免系统分配多线程以及线程间通信时的开销,可以更高效的利用cpu,降低内存的耗用。

缺点:一旦出现错误会导致整个程序崩溃,不擅长大量的计算,无法利用多核cpu(貌似现在也有办法)

非阻塞I/O

非阻塞I/O从名字上便可以理解,为了提高程序的性能,更好的提高线程的利用率,尽量不让线程空闲着。

比如我们想要读取一个文件,然后再进行一些操作,当然这些操作的前提条件是不需要这个文件的数据,这个时候我们便可以让系统的某个线程去读取文件,同时程序的主线程继续执行下面的操作,程序并不会等待文件读取完毕才继续执行,这就像我们常用的ajax

事件驱动

Nodejs提供的绝大多数API都是基于事件的、异步的风格,就是服务器程序的入口也是从connect事件开始。

还是继续上面的读取文件的例子,假如我要读取一个文件,然后要打印出文件的内容,那么读取文件便是一个事件(readFile),而打印的操作要在事件的回调函数中执行。

在这里又涉及到了事件队列和事件循环:

程序主线程顺序执行,当遇到一个事件时会将其添加进事件队列,Nodejs底层的libuv库(不要问我这是什么鬼,底层的东西看着都吓人)负责将事件队列中不同的事件任务分配给不同的线程去执行,执行的结果再重新返回给用户,这便是事件循环。

为什么Nodejs是单线程的,却在这里又变成了多线程,其实Nodejs对外展示是单线程的,但内部其实是多线程的,Node本身的主线程主要就是起不断往返调度的作用

二、例子更好理解

说了这么多,比个例子吧。我在网上定了个外卖,老板在店里安排人给我派送,定完外卖之后开始打游戏,正打着激烈的时候派送员来了,玩的正嗨呢,没空开门,结果派送员在门外等了1一分钟才去开门,至此我定外卖的这个过程也就结束了。

在这个例子中我就相当于主线程,我定了外卖后这个单子就会加入到店铺的订单列表,就相当于一个事件加入到了事件队列,老板就是这个libuv,他在店里运筹帷幄安排人员给我做饭,然后送外卖,即分配线程执行事件任务,当送回来时如果我是空闲的我就会立刻开门收快递,但是当时我正忙着(打游戏很重要),所以派送员久等了一会,即事件执行之后的回调函数是否会立即执行要看主线程是否空闲。

三、总结

1.Node 表面上是单线程,其实内部仍然是多线程的,主线程起往返调度

2.单线程、事件驱动、非阻塞I/O,我的理解是事件驱动只是为了实现非阻塞的方式,非阻塞才是目的

转载:https://www.jianshu.com/p/14bb2b4038d3

Linux非阻塞启动node,Node-单线程、事件驱动、非阻塞I/O相关推荐

  1. linux pm2 权限,pm2 部署 node的三种方法示例

    Node安装以及部署 去官网下载最新版本,分两种一种是源码,一种是编译后的文件.下面是官网下载地址: https://nodejs.org/en/download/current/  分不同的版本 w ...

  2. Linux 使用fcntl c_cc[VMIN] c_cc[CTIME]设置串口阻塞与非阻塞读取数据

    一.概述 Linux串口非常灵活,可以根据需要配置成标准串口和自定义串口模式,就Linux 串口读取数据来说,有有两种主要方式:阻塞与非阻塞. 阻塞:一直等待数据,直到退出条件成立: 非阻塞:及时返回 ...

  3. Linux(centos6.0)下安装Node.js以及使用

    Linux下(centos6.0)安装Node.js 1.wget http://nodejs.org/dist/node-v0.6.9.tar.gz     tar  zxvf node-v0.6. ...

  4. pythontcp服务器如何关闭阻塞_python实现单线程多任务非阻塞TCP服务端

    本文实例为大家分享了python实现单线程多任务非阻塞TCP服务端的具体代码,供大家参考,具体内容如下 # coding:utf-8 from socket import * # 1.创建服务器soc ...

  5. Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】

    阅读目录 1,以阻塞方式运行: 2,以非阻塞方式运行: 转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章 ...

  6. linux中源码安装node

    Linux上安装Node.js 直接使用已经编译好的包 node 官网已经把linux 下载版本更改为已经编译好的版本了,我们可以直接下载解压后使用: wget https://nodejs.org/ ...

  7. 如何启动一个node服务器用来mock数据

    在现如今前后端分离的时代,前后端各自开发,难免有事出现进度不一致的情况,当前端需要数据,而后端还没写出接口的时候,无需等待,只要定义好数据结构,前端就可以启动一个node服务器,自由的玩耍啦. 1,了 ...

  8. Linux驱动(六)设备驱动中的阻塞与非阻塞IO

    我们在Linux学习(二十三)IO模型中了解了LINUX中IO模型,IO模型最简单的可以分为阻塞IO和非阻塞IO.并且学习了一个用如何使用阻塞操作和非阻塞操作.而应用层之所以能实现阻塞操作和非阻塞操作 ...

  9. java非阻塞锁_Java并发问题的非阻塞解决方案

    转自http://blog.csdn.net/u011277203/article/details/9223545 在并发环境中,对于共享资源通常会采用显式的锁机制(比如synchronized或Re ...

最新文章

  1. 特殊时期,对数据中心运营有哪些影响?
  2. 我的图床设置PicGo
  3. boost::safe_numerics::safe相关的测试程序
  4. 64位cad commondialog添加_常用软件分享PDF转CAD软件
  5. Hadoop生态hive(六)Hive QL表
  6. 以国家战略科学家身份,顶级AI学者朱松纯回国,筹建北京通用AI研究院
  7. php字符串中单引号与双引号的区别,简单概括PHP的字符串中单引号与双引号的区别...
  8. JS天气插件(最全)
  9. 洛谷P1080 国王游戏
  10. mysql utf-8_完美解决mysql下utf-8的乱码问题
  11. 2016 中国大数据技术大会 相关资料
  12. FriendStyle CSS
  13. Eclipse编辑器基本设置
  14. MPC-BE 1.6.0.6370 Beta 经典多媒体播放器
  15. 深度学习入门(一)——深度学习是什么?
  16. 统计学第四周-概率分布
  17. 天南地北双飞客,老翅几回寒暑!
  18. nodejs 运行在tomcat_nodejs和tomcat的区别是什么?
  19. vs2017下libcef配置
  20. Linux的so文件

热门文章

  1. cjson 对象是json数组型结构体_C语言 - cJSON解析特定格式 含有数组array类型的数据...
  2. js求两圆交点_Chart.js找到交点Point并绘制一个圆
  3. 基于深度学习的异构时序事件患者数据表示学习框架
  4. 作者:周园春(1975-),男,中国科学院计算机网络信息中心研究员、博士生导师...
  5. 《大数据》第1期“动态”——站在大数据的风口上
  6. 【计算机网络】为什么一个路由器会有两个wifi信号
  7. 文字框架拼接(洛谷P4327题题解,Java语言描述)
  8. 【Python】Numpy处理.csv数据
  9. Java中的Map、Set、List各种方式遍历
  10. cesium(鼠标事件)