假设我有一个在NodeJS中运行的示例代码
function (){
///OPERATION 1
///OPERATION 2
}
考虑这些操作都不需要任何时间,默认情况下javascript会同时运行两者或者完成操作1然后执行操作2?
答案 0 :(得分:1)
在同一进程中,没有两行JavaScript同时运行。如初。
请参阅concurrency vs parallelism。
Node.js中的异步代码 - 假设没有涉及工作进程 - 始终以并发性运行,从不并行运行。并发更容易编程,并帮助我们快速构建复杂的机器。要“向上扩展”,您可能需要引入工作进程来并行工作。
在您的示例中,如果两个操作都是同步的,则它们将按照编写顺序运行(1
,2
)。事实上,如果操作1
是同步的,无论如何它总是先运行。如果两者都是异步的,那么您的体验方式取决于每个人完成的时间长短!如果操作1
是异步的但操作2
是同步的,那么它们似乎会以相反的顺序运行(2
,1
)。这与函数在event loop上安排的方式有关,所以理解这将有助于这一切都有意义。
深吸一口气。深度潜水的时间。
要清楚,实际上,代码行总是按顺序执行。我们没有GOTO并且JavaScript引擎不会神秘地跳到不同的地方。要理解的关键是当有人说某个函数是异步时,它实际上也部分是同步。 同步发生的事情。否则它将是一个空函数。相反,它只是意味着只有一小部分工作是同步完成的,通常只包含调度工作以供日后使用,然后其余的工作稍后进行。
所以当我说如果它们都是异步然后“它依赖”时,它只是该函数的完成或结果(通过回调体验)或Promise)其顺序与其他异步函数的完成无关。对于完全同步的函数,情况并非如此,因为世界停止了同步函数。
如果你有两个功能试图从两个不同的来源检索相同的数据,一个来自你的硬盘,另一个来自互联网,这将首先完成?如果它们都是异步的,那么这是一个棘手的问题。可能硬盘速度更快,但不要赌你的生活。不过,其中一个在技术上首先同步开始。
这种在以后安排事情并且在继续(非阻塞)之前不等待结果的范例是Node.js即使没有工作进程/并行性也能够提供如此优异性能的方法之一。特别是对于I / O,例如从磁盘读取文件,存在“静默期”的不活动状态,其中没有任何进程可以执行。在这种情况下,在继续之前等待是一个巨大的浪费时间。在此期间使用该机会交错其他功能更合适。这是异步函数的作用。他们推迟工作以允许我们交错其他工作。通常他们会通过process.nextTick()或setImmediate()来实现此目标。
所有这一切,生活中没有任何东西是免费的。延迟工作需要付出代价,如果你滥用计时器,你会减慢你的计划。目标是使所有具有不可避免的延迟(如I / O)的东西异步,几乎没有其他东西。但是异步行为“会污染堆栈”。任何使用异步函数的东西本质上都是异步的。你可以同步返回一个值并假装不是这样(让它对外界不可见),但这通常是一个坏主意,因为那样你就无法传播错误或结果。
如果您仍然对如何查看程序并弄清楚所有内容何时运行感到困惑,请查看async and await。编写看起来更传统的同步代码的异步代码是一种很棒的方式。它正在到达Node 7。