一、node是如何处理web请求的

浏览器中的js是单线程的,node也是单线程的。这个单线程相当于一个大管家,一切大小事务都要经过他的手才能办成,它总是把IO任务放入到任务池中。
虽然说是单线程,但是node也有一个线程池专门负责执行任务池中的任务,它们把任务完成之后会告知主线程以接下来利用CPU完成处理。
关键在于理清哪些任务是主线程做的,哪些任务是线程池做的。
对于IO操作(例如文件读取、数据库读取、网络请求等),基本全部是线程池完成的(IO操作也有阻塞式的写法);对于计算任务,都是主线程完成的。
不要小看IO操作占用的时间,node的重要优势就是把IO操作放到了主线程之外,从而让主线程腾出手来去处理更多的请求。
node的线程池基于libuv这个库。

node技术的底层依赖:

  • V8:Google 推出的 Javascript VM,也是 Node.js 为什么使用的是 Javascript的关键,它为 Javascript提供了在非浏览器端运行的环境,它的高效是 Node.js 之所以高效的原因之一。
  • Libuv:它为 Node.js 提供了跨平台,线程池,事件池,异步 I/O 等能力,是 Node.js 如此强大的关键。
  • C-ares:提供了异步处理 DNS 相关的能力。
  • http_parser、OpenSSL、zlib 等:提供包括 http 解析、SSL、数据压缩等其他的能力。

二、其它语言是如何处理web请求的

以python为例,gunicorn服务器可以指定worker数,表示可以同时处理的任务数。即便这些任务都是CPU密集型操作,gunicorn也能够最多支持和worker数相等的请求。而node最多只能支持一个CPU密集型任务。
简言之,node相当于一个worker,但是这个worker效率比较高(因为把IO和计算分离开了)。
实际上,node可以通过开很多个进程,通过nginx负载均衡来实现多个worker,这样完全可以达到和其它语言相同的效果。
简言之,开多个worker谁都会。node的优势在于这个优秀的单线程。
开多个worker应该是优化的最后一步,是实在想不出更好办法之后的办法。node的创新之处就在于IO和计算分离,从而将并发量提高了许多。
IO和计算分离是一种思想,并非只能用js实现,其它语言也可以借鉴。

三、node的优势和劣势

  • node擅长执行IO密集型任务,不善于执行CPU密集型任务。
  • node的效率比传统阻塞式web服务高,为啥以前没有想到使用事件驱动模型把IO和计算进行分离?因为分离是有代价的,node异步模式带来了大量的回调,回调一旦太深,代码可读性极差。
  • node的主线程不能崩,主线程一崩整个服务全挂掉。因此一定要接住异常,这个问题不算劣势,因为很容易解决。

四、node如何实现多个worker

cluster模块已经成为node的标准模块了,这个模块赋予了node多worker的能力。使用nginx+多个实例的方法需要占用多个端口,cluster则能够让多个worker共用同一端口。
原来的单线程模型处理计算密集型任务的线程只有一个,即主线程;处理IO的线程有多个。现在cluster通过开辟多个处理计算密集型任务的线程实现了多worker。

参考资料

一篇cluster的详细讲解
https://blog.csdn.net/leohzj/article/details/50462231

Node单线程高并发原理的更多相关文章

  1. 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

    完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...

  2. MySQL InnoDB 实现高并发原理

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  3. nodejs 单线程 高并发

    nodejs为什么是单线程且支持高并发的脚本语言呢? 1.node的优点:I/O密集型处理(node的I/O请求都是异步的,如:sql查询.文件流操作.http请求……):异步I/O?顾名思义就是异步 ...

  4. 协程--gevent模块(单线程高并发)

    先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...

  5. nginx、swoole高并发原理初探

    阅前热身 为了更加形象的说明同步异步.阻塞非阻塞,我们以小明去买奶茶为例. 同步与异步 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式. 同步:当一个同步调用发出去后,调用者要一直等待调 ...

  6. InnoDB高并发原理

    一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...

  7. 【多线程与高并发原理篇:4_深入理解synchronized】

    1. 前言 越是简单的东西,在深入了解后发现越复杂.想起了曾在初中阶段,语文老师给我们解说<论语>的道理,顺便给我们提了一句,说老子的无为思想比较消极,学生时代不要太关注.现在有了一定的生 ...

  8. Proactor设计模式:单线程高并发

    Boost::Asio为同步和异步操作提供了并行支持,异步支持基于前摄器模式,这种模式的优点和缺点可能比只同步或反应器方法要低. 让我们检查一下Boost::Asio是如何实现前摄器模式的,没有引用基 ...

  9. Netty高并发原理

        Netty是一个高性能 事件驱动的异步的非堵塞的IO(NIO)框架,用于建立TCP等底层的连接,基于Netty可以建立高性能的Http服务器.支持HTTP. WebSocket .Protob ...

随机推荐

  1. [转]PostgreSQL Replication之扩展与BDR

    原文:https://www.cnblogs.com/xmzzp/p/6284300.html postgres 实现master, slave ,且master是多主. -------------- ...

  2. extjs_08_界面布局

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  3. 关于 redis 报错 :JsonParseException: Unrecognized token 'xxx': was expecting ('true', 'false' or 'null')

    在使用java  读取redis存储的数据时出现 JsonParseException: Unrecognized token 'xiaoqiang': was expecting ('true', ...

  4. 强大的Mockito测试框架

    转载:https://blog.csdn.net/dc_726/article/details/8568537 1自动生成Mock类   在需要Mock的属性上标记@Mock注解,然后@RunWith ...

  5. Eclipse导入git上的maven web项目 部署 - lpshou

    http://www.tuicool.com/articles/fqm2Qf   推酷 文章 微博 主题 站点 活动 应用 周刊 登录   Eclipse导入git上的maven web项目 部署 - ...

  6. Discuz常见小问题-如何关闭验证码

    进入后台,在防灌水,验证设置中可以切换哪些情况下是否使用验证码 如果启用验证码,也客户修改验证码的难度,样式.最后点击提交,完成之后可以退出到前台,测试是否能够不用验证码自动登录

  7. Bridging and Bonding with CentOS 6.5

    eth0和eth1要做bond,然后kvm虚拟机通过bridge与外界通信. 那么就要在bond上做bridge.配置文件例如以下,实測这样配置,能够从kvm虚拟机ping通外界拓扑. ifcfg-e ...

  8. Linux 远程和本地的一些解决方式

     有的小伙伴想Linux 远程登录 两台机器同一时候root登录.事实上能够同一时候多个用户的. Linux是多用户的多任务系统,能够同一时候多个用户登录到系统,也能够一个用户通过不同终端登录到一个系 ...

  9. Fibre Channel address weaknesses

    http://searchitchannel.techtarget.com/feature/Fibre-Channel-address-weaknesses Figure 2.1 Five layer ...

  10. oneinstack一键部署linux生产环境那点事(ubuntu)

    http://oneinstack.com/install/ (1)将oneinstack-full.tar.gz最新版安装文件上传至/usr/local/下 (2)解压tar xzvf oneins ...