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. 微信小程序加密解密 C# 以及 填充无效,无法被移除错误的解决方案 Padding is invalid and cannot be removed
  2. telnet给服务器发消息,Telnet按字符发送字符串
  3. careercup-数组和字符串1.7
  4. androidstudio --debug 出现 source code not match bytecode
  5. 744. 寻找比目标字母大的最小字母 golang
  6. 整数线性规划实现(lingo,python分枝界定法)
  7. bash ./php-memcache.sh,PHP+shell脚本操作Memcached和Apache Status的实例分享
  8. GBK、UTF-8 快速转码工具 —— Notepad++
  9. 用Prim和Kruskal两种算法,求解最小生成树
  10. 【4747】java语言程序设计(一)2011年10月考试复习资料_全国2011年10月自考Java语言程序设计(一)试题3...
  11. 个人带领团队做过的事
  12. 救济金发放_通过专门的视频游戏提供癌症救济
  13. grep exclude
  14. 7-4 房产税费计算2022(分数 12)
  15. java怎么注释多行注释_java的注释格式和多行注释和单行注释
  16. java中高级面试_Java中高级面试题及答案
  17. 北京市社保定点医疗机构查询【2021年1月】
  18. vue和原生js的优点分析
  19. 分类号检索不好用?那是因为你压根没用对分类
  20. sht11温湿度传感器

热门文章

  1. 专题导读:大数据异构并行系统
  2. 张庆余(1991-),男,北京卡达克数据技术中心软件业务本部助理工程师,主要研究方向为软件架构、云计算。...
  3. 作者:吴甘沙,男,现任英特尔中国研究院院长。
  4. 【计算机网络】比较TCP与UDP
  5. Java元组Tuple介绍与使用
  6. Linux 双网卡绑定
  7. Java对PHP服务器hmac_sha1签名认证方法的匹配实现
  8. awk批量修改文件名,awk用法
  9. 如何配置x225/x235/x335/x345的LSI SCSI卡实现RAID-1功能
  10. QTP User-Defined Function 学习经验汇总