【问题标题】:What stops Node.js from being asynchronous是什么阻止了 Node.js 异步
【发布时间】:2018-11-03 14:11:25
【问题描述】:

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

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

但我注意到,即使是 for 循环这样简单的事情也会阻塞主事件循环。

例子:

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

func1()
func2()

在这种情况下,'func1' 将始终在 'func2' 之前打印,并且在循环完成时首先打印。这对我来说似乎并不异步。我的意思是为什么我们要等待 func1 完成后再运行 func2?

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

【问题讨论】:

  • 一台计算机可以这么快地计算for循环,它可能比gap还快

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


【解决方案1】:

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

这个循环只接受任务(在你的情况下执行你的 .js 代码),然后这个单线程必须从头到尾。在这段时间内不会执行任何其他操作。 (请注意高级用户 - 如果您产生工人,您可以,但这不是您通常使用 Node.js 的方式)

它有很多优点——没有死锁、确定性行为等。

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

但是你写的代码总是这样的:

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

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多