当前位置:首页 > 日记 > 正文

Node.js的事件循环(事件循环)和线程池的详细方案

Node.js的事件循环(事件循环)和线程池的详细方案
事件循环(event loop)节点是其处理大并发和高吞吐能力的核心。这是最了不起的地方,Node.js基本上是理解为一个单一的线程并允许任何操作是在后台处理。本文将解释如何活动周期,你也能感觉到它的魔力。

事件驱动编程

为了理解事件周期,首先理解事件驱动的编程,它出现在1960。今天,事件驱动编程广泛应用于UI编程中。Javascript的主要用途之一是与DOM交互,所以使用基于事件的API是很自然的。

简单定义:事件驱动编程通过事件或状态的变化来控制应用程序,它通常由事件监控实现,一旦检测到事件(即状态改变),就会调用相应的回调函数。事实上,这是对Node.js的事件循环的基本原理。

如果你熟悉客户端Javascript开发,想想那些。*()方法,如element.onclick(),并结合DOM元素的迁移用户交互。这种工作方式允许将多个事件在一个单一的instance.node.js触发触发此模式通过EventEmitter(事件发生器),这样在服务器端socket和HTTP模块。一个或多个状态的变化可以从一个单一的实例触发。

另一个常见的模式是成功的成功和失败表示失败。有实现它现在常用的两种方法。第一是通过错误异常的回调,通常是作为回调函数的第一个参数传递。二是承诺的设计模式的使用,它已被添加到6。承诺模式使用jQuery的功能一样链写作方法,避免深幅回调函数的嵌套,如:

复制代码代码如下所示:

美元。getJSON( / getUser)。做(successhandler)失败(failhandler)。
大多数的FS(文件系统)模块采用来料异常的风格在后面的音。有些电话触发技术,如fs.readfile()额外的事件,但是API只是提醒用户表达的成功或失败的操作。这样一个API的选择是基于建筑考虑,而不是技术上的限制。

一个常见的误解是,事件生成器(事件发射器)在触发事件时也是自然异步的,但这是不正确的。

复制代码代码如下所示:

函数的MyEmitter(){

eventemitter.call(本);

}

util.inherits(myemitter,EventEmitter);

myemitter.prototype.dostuff =功能doStuff(){

console.log(以前)

Emitter.emit()

console.log(' ')}

};

VAR我=新MyEmitter();

Me.on(函数(){(){

console.log('emit开除);

});

Me.doStuff();

输出:
发射/发射
如果emitter.emit是异步的,输出应
发射/发射
EventEmitter往往是非常异步的,因为它往往是用来通知需要异步完成的操作,但EventEmitter API本身是完全同步的,听者内功能可以异步执行,但注意所有的听力功能将在添加顺序执行。

机制概述和线程池

节点本身依赖于多个图书馆。其中一个是libuv,对异步事件队列的魔法和图书馆的执行。

节点尽可能使用尽可能多的操作系统内核来实现现有的功能,比如生成响应请求(请求)、向前连接(连接)和委托给系统处理,例如,传入连接由操作系统管理,直到节点可以处理它们为止。

你可能听说过节点都有一个线程池,你可能想知道为什么一个线程池,如果节点将以任务过程中所需要的。这是因为在内核中,不是所有的任务都是异步执行的。在这种情况下,Node.js必须能够锁定的线程一段时间,它可以继续执行事件循环无阻。

下面是一个简单的示例图,以显示他内部的运行机制:
┌—————┐

带有/定时器/

-

屈-苯乙烯-┐

我们进行回调/悬而未决

-:-┌——┐

屈-芪┐ / /输入:

我们执行轮询连接/人。

-。

屈-芪┐--

人-人,setimmediate

---- ----

理解事件循环的内部运行机制有一定的困难:

所有的回调函数是由process.nexttick(),一个阶段的事件循环结束之前(例如,一个定时器)和下一个阶段之前,这将避免潜在的递归调用process.nexttick()和无限循环。

等待回调(等待回调)在回调队列,不会被任何其他事件循环处理回调(例如,通过FS。写)。

事件发射器和事件循环

通过创建EventEmitter,与事件循环的相互作用可以简化。这是一个普遍的封装,使它为你创建的基于事件的API更容易。这两个相互作用往往使开发商感到困惑。

下面的示例表明,被遗忘的事件是同步触发的,并可能导致事件丢失。

复制代码代码如下所示:

/ /后v0.10,不再需要('eventsEventEmitter)。

Var EventEmitter =需要('events);

VaR工具=需要('util);

功能喜欢这样事(){

eventemitter.call(本);

DoFirstThing();

This.emit('thing1);

}

util.inherits(喜欢这样事,EventEmitter);

VaR MT =新喜欢这样事();

Mt.on('thing1,功能onthing1()){

/对不起,这件事永远不会发生。

});
的above'thing1'event不会被MyThing(),因为喜欢这样事()必须被实例化听事件。下面是一个简单的解决方案,不需要添加任何额外的关闭:

复制代码代码如下所示:

Var EventEmitter =需要('events);

VaR工具=需要('util);

功能喜欢这样事(){

eventemitter.call(本);

DoFirstThing();

setimmediate(emitthing1,这个);

}

util.inherits(喜欢这样事,EventEmitter);

功能emitthing1(自我){

Self.emit('thing1);

}

VaR MT =新喜欢这样事();

Mt.on('thing1,功能onthing1()){

实现

});
下面的方案也可以工作,但会失去一些性能:

复制代码代码如下所示:

功能喜欢这样事(){

eventemitter.call(本);

DoFirstThing();

功能#绑定 / /(使用)的性能损失

setimmediate(this.emit.bind(这'thing1 '));

}

util.inherits(喜欢这样事,EventEmitter);
另一个问题是引发的错误(异常),找出应用程序中的问题是困难的,但它几乎是不可能的调试没有调用堆栈(注* e.stack)。在远程异步请求的错误调用堆栈将丢失。有两个可行的解决方案:同步触发或保证误差和其他重要的信息。以下的例子证明这两个解决方案:

复制代码代码如下所示:

mything.prototype.foo =函数foo(){

这将是错误/异步触发器。

无功二= dofirstthing();

如果(呃){

当被触发时,您需要创建一个新站点来保留调用堆栈信息错误。

setimmediate(emiterror,这新的错误(坏东西));

返回;

}

立即触发错误(同步)

无功二= dosecondthing();

如果(呃){

This.emit(错误,坏东西);

返回;

}

}
法官审时度势 u3002when误差引起的,它可以立即处理。或者,它可能是微不足道的,易于处理,或异常,将返工后。此外,通过构造函数传递错误,这不是个好主意,因为构造的对象情况有可能是不完整的。仅仅将错误直接的情况是个例外。

结语

本文讨论了事件循环的内部运行机制和技术细节,都是深思熟虑的。另一篇文章将讨论事件循环和系统内核和显示NodeJS的异步操作的魔法之间的相互作用。

相关文章

CorelDRAW简单画美丽的线条图案

CorelDRAW简单画美丽的线条图案

线条,图案,简单,美丽,电脑软件,本教程介绍给朋友,用CorelDraw绘制优美的线条和图案简单。本教程比较简单,对初学者很有帮助。 在本教程中,CDR学习朋友学习CorelDRAW的简单的方法来画出美丽的线条和图案。本教程属于初级CDR教程,适用于CDR初学者…

用PHP将多维数组中的每个单位值(数

用PHP将多维数组中的每个单位值(数

数字,多维数组,单位,方法,电脑软件,本文演示了用PHP将多维数组中的每个单位值(数字)加倍的方法,供大家参考,具体分析如下: 先决条件:多维数组,每个数组都是一些最小元素。 要求:编写一个将最小单位值加倍的函数。 代码如下 $ ARR =阵列(1,3,a=>20,B …

ai排版AI文本排版规则及技巧

ai排版AI文本排版规则及技巧

文本,规则,技巧,电脑软件,ai,AI如何排版,所以很多人都习惯用ID排版前CDR被释放,CDR有特殊的排版功能在正确的基础上才被行业内的人使用。因此,我已渐渐被忽略和使用。以下是介绍人工智能排版规则的要求和技巧,希望对你有帮助 在以前版本的人工…

ai钢笔工具制作漂亮的字体教程

ai钢笔工具制作漂亮的字体教程

字体,教程,工具,漂亮,电脑软件,本教程介绍给朋友,使用ai钢笔工具来创建漂亮的字体。教程很好,方法很简单。适合初学者学习和推荐朋友。让我们一起学习分享。 本教程是介绍朋友们用艾笔工具制作漂亮字体的方法,很好的教程,推荐在这里,希望能起到…

对fs.chmod方法在Node.js的使用说

对fs.chmod方法在Node.js的使用说

使用说明,方法,电脑软件,fs,chmod,方法显示: 该方法将读取并以异步方式文件的写权限。 操作完成后的回调只接收一个参数,可能出现异常信息。 Grammar: Fs.chmod(路径、模式、回调) 由于该方法属于fs模块,因此需要在使用前引入fs模块(var FS =…

一个热带海洋风格的blisterIconPS

一个热带海洋风格的blisterIconPS

软件设计,图象处理,热带,风格,电脑软件,笔者将图标为两大部分:泡沫和风景。首先,我们应该选择泡沫的一部分最好的一部分,使用透明渐变轻拉梯度逐渐,中间部分手动添加一些高光,景观的一部分将直接使用的材料,使用蒙版来控制范围,处理细节和局部。 …

插画制作时尚粉红色立体海报

插画制作时尚粉红色立体海报

插画,粉红色,海报,时尚,电脑软件,本教程主要使用插画制作粉红色和三维纹理的海报字体。这种字体效果在海报设计中经常遇到,而且立体感和字体质感非常好。让我们和我们最喜欢的朋友一起学习。 本教程主要使用插画制作粉红色和三维纹理的海报…

烟花制作卡通女孩轻松制作GIF动画

烟花制作卡通女孩轻松制作GIF动画

动画,效果图,烟花,卡通,轻松,本教程是介绍给朋友的,利用烟花制作卡通女孩轻松地拍GIF动画效果,教程比较简单,很适合初学者学习,并推荐喜欢一起学习的朋友一起教程。 本教程是介绍给朋友,利用烟花制作卡通动画的女孩闪烁GIF容易。你可以很快理解…

PHP导出和导出CSV文件的详细解释

PHP导出和导出CSV文件的详细解释

解释,文件,详细,电脑软件,PHP,我们首先准备MySQL数据表,假设有一个记录学生信息的表学生,以及ID、姓名、性别和年龄记录学生的姓名、性别、年龄和其他信息。 复制代码代码如下所示: 创建表(学生) ` ID ` int(11)不为空auto_increment, `名字` v…

用js方法实现鼠标图像的透明度变化

用js方法实现鼠标图像的透明度变化

图像,方法,鼠标,透明度,电脑软件,本文介绍了js实现感应鼠标图片透明度变化的方法,供大家参考,具体的实现方法如下: 复制代码代码如下所示: 改变鼠标图像的透明度 功能使可见(狗,这){ 如果(= = 0) 过滤器。alpha。透明度= 100 其他的 过滤器。…

js共享的4种数字第一千格式方法

js共享的4种数字第一千格式方法

方法,种数,格式,第一千,电脑软件,所谓的数字第一千位形式,即从数字的数目,在每三位之间加一个逗号。例如,10000。为了响应这个要求,我最初写了一个函数: 复制代码代码如下所示: 方法 功能少(NUM){ var结果= },计数器= 0; Num =(NUM)。分裂(0 | |)。T…

PS图象处理软件设计简约时尚创意风

PS图象处理软件设计简约时尚创意风

图象处理,软件设计,创意,简约,网页模板,本教程介绍给朋友,谁使用PS图象处理软件的简单网页模板的设计,时尚的创意风格。教程比较实用。制作的作品非常漂亮。 本教程使用PS图象处理软件设计简约时尚风格的网页模板,作品非常好,主要的教程给你制…