在服务器端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?