-->

什么是Node.js的非阻塞或异步I / O?什么是Node.js的非阻塞或异步I / O?(Wha

2019-05-14 01:25发布

在服务器端JavaScript引擎的背景下,什么是非阻塞I / O或异步I / O? 我看到这是因为在Java服务器端实现的优势提及。

Answer 1:

同步和一步

同步执行通常是指在编码序列执行。 异步执行是指没有出现在代码序列中运行执行。 在下面的例子中,同步操作引起警报的顺序射击。 在异步操作,而alert(2)出现第二执行,它没有。

同步:1,2,3

 alert(1); alert(2); alert(3); 

异步:1,3,2

 alert(1); setTimeout(() => alert(2), 0); alert(3); 

阻塞VS非阻塞

阻挡是指阻止进一步执行,直到该操作完成的操作。 非阻塞指代码不阻挡执行。 在给定示例, localStorage是阻塞操作,因为它执行档读取。 在另一方面, fetch是因为它不熄火一个非阻塞操作alert(3)从执行。

// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);

// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);

好处

非阻塞的一个优点,异步操作是你可以最大限度地提高单个CPU的使用率以及内存。

同步,例如阻断

同步,阻塞操作的一个例子是像那些在Java或PHP某些Web服务器如何处理IO或网络请求。 如果你的代码从文件或数据库,代码“块”后,从执行的一切读取。 在此期间,你的机器是持有到内存和处理时间是没有做任何事情的线程。

为了迎合其他的请求,而该线程已经停滞取决于你的软件。 然而,大多数服务器软件做的就是产生更多的线程,以满足额外的要求。 这需要更多的内存消耗更多的处理。

异步的,无阻塞示例

异步非阻塞服务器 - 在节点做出类似的 - 只使用一个线程来服务所有请求。 这意味着节点的实例,使最出一个单线程的。 创作者用的前提下,I / O和网络操作的瓶颈而设计的。

当请求到达服务器,它们是在同一时间服务的一个。 然而,当服务代码需要查询数据库,例如,它发送回调到第二队列,主线程将继续运行 (不等待)。 现在,当DB操作完成并返回对应的回调拉出第二队列,并在它们等待执行的第三队列中排队。 当发动机都将有机会执行别的东西(比如当执行栈被清空),它拿起从第三队列的回调并执行它。



Answer 2:

var startTime = new Date().getTime();
var getEndTime = () => {
    var tempEndTime = new Date().getTime();
    var second = (tempEndTime - startTime)/1000
    return `took ${second} sec...to finish\n`
}

console.log('1: start App', getEndTime())
setTimeout(()=>{
    console.log('2: setTimeout', getEndTime())
}, 1000)
console.log('3: End App', getEndTime())

// console -> Process Order:  1 -> 3 -> 2



文章来源: What is non-blocking or asynchronous I/O in Node.js?