同步与异步nodejs

时间:2017-01-08 05:07:11

标签: javascript node.js

假设我有一个在NodeJS中运行的示例代码

 function (){
   ///OPERATION 1

   ///OPERATION 2

}

考虑这些操作都不需要任何时间,默认情况下javascript会同时运行两者或者完成操作1然后执行操作2?

1 个答案:

答案 0 :(得分:1)

在同一进程中,没有两行JavaScript同时运行。如初。

请参阅concurrency vs parallelism

Node.js中的异步代码 - 假设没有涉及工作进程 - 始终以并发性运行,从不并行运行。并发更容易编程,并帮助我们快速构建复杂的机器。要“向上扩展”,您可能需要引入工作进程来并行工作。

在您的示例中,如果两个操作都是同步的,则它们将按照编写顺序运行(12)。事实上,如果操作1是同步的,无论如何它总是先运行。如果两者都是异步的,那么您的体验方式取决于每个人完成的时间长短!如果操作1是异步的但操作2是同步的,那么它们似乎会以相反的顺序运行(21)。这与函数在event loop上安排的方式有关,所以理解这将有助于这一切都有意义。

深吸一口气。深度潜水的时间。

要清楚,实际上,代码行总是按顺序执行。我们没有GOTO并且JavaScript引擎不会神秘地跳到不同的地方。要理解的关键是当有人说某个函数是异步时,它实际上也部分是同步同步发生的事情。否则它将是一个空函数。相反,它只是意味着只有一小部分工作是同步完成的,通常只包含调度工作以供日后使用,然后其余的工作稍后进行。

所以当我说如果它们都是异步然后“它依赖”时,它只是该函数的完成结果(通过回调体验)或Promise)其顺序与其他异步函数的完成无关。对于完全同步的函数,情况并非如此,因为世界停止了同步函数。

如果你有两个功能试图从两个不同的来源检索相同的数据,一个来自你的硬盘,另一个来自互联网,这将首先完成?如果它们都是异步的,那么这是一个棘手的问题。可能硬盘速度更快,但不要赌你的生活。不过,其中一个在技术上首先同步开始。

这种在以后安排事情并且在继续(非阻塞)之前不等待结果的范例是Node.js即使没有工作进程/并行性也能够提供如此优异性能的方法之一。特别是对于I / O,例如从磁盘读取文件,存在“静默期”的不活动状态,其中没有任何进程可以执行。在这种情况下,在继续之前等待是一个巨大的浪费时间。在此期间使用该机会交错其他功能更合适。这是异步函数的作用。他们推迟工作以允许我们交错其他工作。通常他们会通过process.nextTick()setImmediate()来实现此目标。

所有这一切,生活中没有任何东西是免费的。延迟工作需要付出代价,如果你滥用计时器,你会减慢你的计划。目标是使所有具有不可避免的延迟(如I / O)的东西异步,几乎没有其他东西。但是异步行为“会污染堆栈”。任何使用异步函数的东西本质上都是异步的。你可以同步返回一个值并假装不是这样(让它对外界不可见),但这通常是一个坏主意,因为那样你就无法传播错误或结果。

如果您仍然对如何查看程序并弄清楚所有内容何时运行感到困惑,请查看async and await。编写看起来更传统的同步代码的异步代码是一种很棒的方式。它正在到达Node 7。