关闭

了解node.js事件循环

时间: 2018-06-08阅读: 1148标签: node

node.js的第一个基本论点是I / O的性能消耗是很昂贵:



因此,使用当前编程技术的最大浪费来自于等待I / O完成。有几种方法可以处理性能影响(来自Sam Rushing)):

  • 同步:您一次处理一个请求,每个请求依次处理。优点:简单。缺点:任何一个请求都需要等待上一个请求的完成后才执行。

  • 启动一个新的进程:你使用一个新的进程来处理每个请求。优点:容易。缺点:不能很好地扩展,数百个连接意味着数百个进程。 fork()是Unix程序员的锤子。因为它是可用的,所以每个问题看起来都像一个钉子。这通常是矫枉过正

  • 线程:启动一个新线程来处理每个请求。优点:简单,并且比使用fork更亲切,因为线程通常具有更少的开销。 缺点:您的机器可能没有线程,并且线程化编程可能会变得非常复杂,并且担心控制对共享资源的访问。

第二个基础论点是线程每连接的内存很贵:[例如该图表显示了与Nginx相比,Apache吸收内存的每个人都清楚]

Apache是​​多线程的:它为每个请求产生一个线程(或进程,它依赖于conf)。随着并发连接数量的增加以及需要更多线程来为多个同时的客户端服务,您可以看到这种开销如何消耗内存。 Nginx和Node.js不是多线程的,因为线程和进程会带来沉重的内存成本。它们是单线程的,但是基于事件。这消除了数千个线程/进程通过处理单个线程中的多个连接而产生的开销。


Node.js为您的代码保留单个线程...

它确实是一个单线程运行:你不能执行任何并行代码;例如做一个“sleep”会阻塞服务器一秒钟:js while(new Date().getTime()< now + 1000){// do nothing}所以当这段代码运行时,node.js不会响应来自客户端的任何其他请求,因为它只有一个执行代码的线程。或者如果你有一些CPU密集的代码,比如说调整图像大小,那么它仍然会阻止所有其他的请求。


..然而,除了你的代码,所有东西都是并行运行

在单个请求中没有办法让代码并行运行。但是,所有的I / O都是偶数并且是异步的,所以下面不会阻塞服务器:[codesyntax lang =“JavaScript”]

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

如果你在一个请求中这样做,其他请求可以在数据库运行时进行处理。


为什么要这样处理?我们什么时候从同步到异步/并行执行?

同步执行很好,因为它简化了编写代码(与线程相比,并发问题有导致WTF的倾向)。

在node.js中,你不应该担心后端会发生什么情况:只要在做I / O时使用回调;并确保您的代码永远不会中断,并且执行I / O不会阻止其他请求,而不会导致每个请求的线程/进程成本(例如Apache中的内存开销)。

拥有异步I / O是很好的,因为I / O的更高效,我们应该做更好的事情,而不仅仅是等待I / O。


事件循环是“处理和处理外部事件并将其转换为回调调用的实体”。因此,I / O调用是Node.js可以从一个请求切换到另一个请求的点。在I / O调用中,您的代码会保存回调并将控制权返回给node.js运行时环境。当数据实际可用时,稍后调用回调。

当然,在后端,有数据库访问和流程执行的线程和进程。然而,这些并没有明确暴露给你的代码,所以除了知道I / O交互例如与数据库或与其他进程的异步从每个请求的角度来看,因为这些线程的结果通过事件循环返回到您的代码。与Apache模型相比,线程和线程开销较少,因为每个连接都不需要线程;当你绝对肯定必须有别的东西并行运行时,即使这样管理也是由Node.js来处理的。

除I / O调用外,Node.js预计所有请求都会很快返回;例如应将CPU密集型工作分解到另一个可与事件交互的进程,或使用WebWorkers之类的抽象。这(显然)意味着如果没有另一个线程与您通过事件交互的背景进行交互,则无法并行化代码。基本上,所有发出事件的对象(例如,EventEmitter的实例)都支持异步的偶数交互,并且你可以用这种方式与阻止代码进行交互,例如,使用所有这些都是Node.js中的EventEmitter的文件,套接字或子进程。多核可以使用这种方法完成;另请参阅:node-http-proxy。

内部实施

在内部,node.js依靠libev来提供事件循环,这是libeio的补充,它使用池化线程来提供异步I / O。要了解更多信息,请查看libev文档


那么我们如何在Node.js中进行异步?

Tim Caswell在他精彩的演讲中描述了这些模式:

  • 一流的功能。例如。我们将函数作为数据传递,随机播放并在需要时执行它们。
  • 功能组成。也称为具有匿名函数或闭包,在事件发生在偶数I / O之后执行。
原文链接: blog.mixu.net 
翻译来源:www.zcfy.cc 
站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/867

关闭

nodejs的jekins部署

gitlab项目仓库给jekins服务器分配一个账号develop权限用于拉取代码。分支为master。jekins配置打包脚本。思路就是拉取最新代码后,安装相关依赖。删除旧打包文件。新建打包文件项目名.tar.gz。通过SSH传输打包文件项目名.tar.gz到测试服务器指定目录。

node如何避免崩掉?

当你在node中没有处理reject状态的promise或在一个流中没有处理错误error事件,会引起你的程序崩溃。下面我们来看一下如何避免我们的node程序崩溃。

node实现批量修改图片尺寸

大家在工作中肯定有没有遇到过图片尺寸和我们要求的尺寸不一致的情况吧?通常我们会在网上找一下找在线的或者下载一个小工具,再或者通过 ps 的批处理解决

把你的NodeJS程序给没有NodeJS的人运行

众所周知,NodeJS程序开发简便且容易实现跨平台。但是,当你开发了一个NodeJS程序,想要分发给其他人运行的时候,你会发现,你往往需要对方也来安装一个NodeJS环境

Node.js 15 正式版发布

前两天,Node.js官方发布了Node.js 15的正式版本,Node.js 15 将替代 Node.js 14 成为当前的的稳定发行版,后者将在本月晚些时候升级为 LTS(长期支持)版本。如果大家想体验下Node.js 15 的最新功能

当node升级后导致webpack打包出错,node-saas出问题的解决办法

node-saas就需要python环境了,所以很多人又不知道,就升级了node,导致node-saas无法使用了,结果导致node-saas出错,解决办法如下:npm install -g node-gyp ,npm install --global --production windows-build-tools

node简单的上传图片

首先:要做到服务器获取到你上传的文件,配置好koabody。(其实还有很多关于上传的中间件,因为本来就使用了koabody的中间件就直接用这个就好了)

什么是node repl?

Node REPL(Read Eval Print Loop)是Node自带的交互式解释器(又名Node shell),表示一个电脑的虚拟环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。

前端有必要去学 Node.js 吗?

可能你看过Node是什么,看过Node的文档,用Node写过一些小项目。但是如果问你——你知道在一线互联网企业里,Node真正是怎么用的吗?是拿来做什么的?怎么做?

nodejs 异步转同步

nodej项目在微信环境开发,nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!