为什么80%的码农都做不了架构师?>>>   

 关于Node.js的第一个基本概念是I/O操作开销是巨大的:

 所以,当前变成技术中最大的浪费来自于等待I/O操作的完成。有几种方法可以解决性能的影响:

  同步方式:按次序一个一个的处理请求。利:简单;弊:任何一个请求都可以阻塞其他所有请求。

  开启新进程:每个请求都开启一个新进程。利:简单;弊:大量的链接意味着大量的进程。

  开启新线程:每个请求都开启一个新线程。利:简单,而且跟进程比,对系统内核更加友好,因为线程比进程轻的多;弊:不是所有的机器都支持线程,而且对于要处理共享资源的情况,多线程编程会很快变得太过于复杂。

  第二个基本概念是每个连接都创建一个新线程是很消耗内存的(例如:你可以对比Nginx回想一下Apache内存耗尽的情景)。
  Apache是多线程的:它为每个请求开启一个新的线程(或者是进程,这取决于你的配置),当并发连接增多时,你可以看看它是怎么一点一点耗尽内存的。Nginx和Node.js不是多线程的,因为线程的消耗太“重”了。它们两个是单线程、基于事件的,这就把处理众多连接所产生的线程/进程消耗给消除了。
  Node.js中你的代码运行在单线程之中
  确实只有一个线程:你不能并行执行任何代码,比如:下面的“sleep”将会阻塞sever1秒钟:
  

while(new Date().getTime() < now + 1000) {// do nothing}

  当这段代码运行时,Node.js不会响应客户端任何请求,因为只有一个线程来运行你的代码,另外,如果你执行cpu密集的任务,比如重设图像的大小,它也会阻塞所有请求。
  ……然而,除了你的代码,其它的一切都是并行执行的
  单线程没法让代码并行执行。但是所有I/O操作都是事件驱动、并行的,所以下面的代码不会阻塞server:

  c.query('SELECT SLEEP(20);', function (err, results, fields) {if (err) {throw err;}res.writeHead(200, {'Content-Type': 'text/html'});res.end('Return from async DB query   ');c.end();});

  如果你在一次请求中执行这些,当数据库sleep时,其他请求也会立即被处理。

  为什么异步比较好?什么时候我们应该从同步转移到异步/并行执行呢?

  同步执行也不错,因为它简便了我们敲代码。但在使用异步时,你不必关心后端是怎么处理的。而且,在I/O操作时不会阻止其他请求,同时无需承担每个请求所产生的线程/进程的成本。
  I/O操作时使用异步处理很好,因为I/O操作的成本比单纯执行代码要高的多,我们应该在等待I/O时做其它更有意义的工作。

转载于:https://my.oschina.net/freax/blog/413785

理解Node.js的event loop相关推荐

  1. 理解node.js中的 Event Loop

    node中的 "event loop" 正是node能处理高并发的核心所在.也正是因为它,node虽然在本质上是个单线程,却能让大量的操作处于后台运行.这篇文章将详细说明 even ...

  2. 深入理解 Node.js 中的 Worker 线程

    多年以来,Node.js 都不是实现高 CPU 密集型应用的最佳选择,这主要就是因为 JavaScript 的单线程.作为对此问题的解决方案,Node.js v10.5.0 通过 worker_thr ...

  3. 理解node.js(Understanding node.js)

    因为最近自己在学习node.js,刚开始学.看到这篇文章挺有意思,介绍了一下node.js有助于理解基于事件驱动的回调,就翻译了一下. 英文原文: Understanding node.js 理解no ...

  4. 对于怎么理解js中Event Loop,你可以看这篇文章

    javascript中event loop是什么 声明 源文档地址 介绍 如何你跟我一样的话,那么你一定会爱上javascript!虽然它不是一种比较完美的编程语言,但是严格地说,还有其它比javas ...

  5. linux进程退出所有tcp数据才发送,深入理解Node.js 进程与线程(8000长文彻底搞懂)...

    前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少.本篇文章除了介绍概念,通过Node.js 的角度讲解进 ...

  6. ajax 高并发请求,理解node.js处理高并发请求原理

    很少分享技术文章,写的不好的地方请大家多多指教,本文是自己对于node.js的一些见解,如有纰漏请在评论区交流. 高并发策略 通常高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程 ...

  7. [译]理解Node.js事件驱动机制

    学习 Node.js 一定要理解的内容之一,文中主要涉及到了 EventEmitter 的使用和一些异步情况的处理,比较偏基础,值得一读. 大多数 Node.js 对象都依赖了 EventEmitte ...

  8. [译]理解 Node.js 事件驱动架构

    原文地址:Understanding Node.js Event-Driven Architecture 大部分 Node 模块,例如 http 和 stream,都是基于EventEmitter模块 ...

  9. [译]深入理解 Node.js Worker Threads

    最近工作中又有可能需要写 Node.js 应用了,距离上次写 Node.js 应用也有好些年了,所以就开始重新熟悉下 Node.js 了.刚好最近又在学 Go,其最大的特点就是简单.轻量级的并发模型. ...

最新文章

  1. Linux_查看CPU信息、机器型号等硬件信息
  2. 关于前后端分离我的理解
  3. 创业——不可忽视的创业计划书!!!
  4. Go的string/int/int64转化
  5. 自然语言处理之神经网络基础(四)
  6. 网站产品设计应避免的7个误区
  7. CH - 0701 国王游戏(贪心+高精度运算)
  8. 二叉树创建及遍历算法(递归及非递归)(转)
  9. 【转】VS编译环境命令窗口中的命令
  10. 计算机信息科学蔺泽浩,上海交通大学计算机科学与工程系(CSE)
  11. Jsp+Ssh+Mysql实现的Java Web学生考勤管理
  12. 超级计算机TOP500、green500、graph500最新排名(2012.11)
  13. Linux安全配置规范
  14. 中国矿业大学python期末考试_中国矿业大学一体化网络校园网——CUMTDDNet-DrCOM网页版认证教程...
  15. layout_gravity和gravity的区别
  16. VS2015编译程序兼容XP
  17. 使用R进行文本数据挖掘
  18. android 画爱心进度条_android自定义圆形进度条,实现动态画圆效果
  19. 爬虫爬取煎蛋网美女图片
  20. Python 二进制文件流转图片

热门文章

  1. springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...
  2. 华为云服务怎么弄金卡会员_万科牵手华为终端云服务,共建松山湖智慧商圈
  3. sqlite 查询 支持多用户同时_SQLite支持多进程同时操作数据库文件吗?
  4. ATM柜员机JAVA课程设计_ATM柜员机学年论文设计(Java课程设计)
  5. java词汇速查手册_java 词汇表速查手册
  6. 全国计算机等级考试东营,东营计算机等级考试报名时间
  7. dbgrideh 为什么只一行_Mysql性能优化:为什么count(*)这么慢?
  8. 小程序的点赞功能能和浏览次数功能_扫码点餐小程序好用吗?小程序还能实现哪些功能?...
  9. mysql百万数据根据索引查询_mysql创建多列索引查询百万表数据的性能优化经验分享...
  10. 类型“unknown”上不存在属性“foreach”_JavaScript红宝书第四版精简解析系列--映射Map数据类型...