什么阻止Node.js异步

时间:2018-05-24 11:09:03

标签: node.js loops asynchronous synchronous event-loop

当您使用Node.js时,您正在使用异步编程。

要处理层次结构,你显然会使用回调。我也知道有些函数阻塞了主事件循环,例如readFileSync()..

但是我注意到像for循环那样简单的事情也阻塞了主事件循环。

示例:

function func1() {
    for(var i = 0; i < 1000000000; i++) {
    }
    console.log("func1")
}
function func2() {
    console.log('func2')
}

func1()
func2()

在这种情况下,&#39; func1&#39;总而言之之前,打印&#39; func2&#39;并且首先完成循环。这对我来说似乎不同步。我的意思是为什么我们在运行func2之前等待func1完成?

是否有任何阻止主事件循环的动作列表,或者有人可以解释为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

Node.js有所谓的事件循环,它只由一个线程执行。

这个循环只需要执行任务(在你的情况下执行你的.js代码),然后这个单线程必须从头开始到结束。在这个时间没有别的将被执行。 (只需注意高级用户 - 如果你产生了工作者,你可以,但不是你通常使用Node.js的方式)

它有许多优点 - 没有死锁,确定性行为等。

因此,异步性意味着如果您启动异步任务(即请求某个Web),它不会阻止您的事件循环被执行。它被放入堆栈并等待事件循环接受它,或者如果它是一些更高级的模块,它会产生内部工作者来处理内部的东西。

但是你编写的代码总是如下:

  • 从事件循环堆栈中获取任务
  • 从头到尾执行所有同步上下文
  • 将所有异步任务置于堆栈
  • 重复这个过程