Node.js的事件驱动架构和其他语言的多线程编程之间有何区别?


回答 1:

在事件驱动和多线程范例中,代码都在操作系统进程内运行。

当进程运行多个线程时,这些线程共享进程内存(地址空间)以进行读取和写入。

支持Node.js的JavaScript在设计上是单线程的。每个函数都保证可以运行完成,并且在该函数运行期间,当前进程中的其他JavaScript代码都不会运行。引擎处理自然异步事件(网络,磁盘输入输出,计时器,其他硬件和操作系统事件),该引擎将注册为这些事件的处理程序(或回调)的JavaScript函数添加到事件循环队列中,以在之后执行队列前面的功能已经完成。

在多线程范例中,两个或多个线程并行运行代码,因此在函数运行期间,不同的代码段也可能在不同的处理器内核上运行,可能会读取或写入相同的内存地址。除非代码使用特殊的操作系统机制(同步原语)来管理对共享内存的访问,否则这可能导致内存状态不一致。



回答 2:

这是一个很好的问题,“ Node.js的事件驱动架构与其他语言的多线程编程之间有何区别?”。

我们可以并且应该对此进行分解。

  • Node的事件驱动架构。

事件驱动架构不是Node独有的,例如Tornado(Python),Vertx(Java),Akka(Scala),ReactiveX(多种语言)。

  • 其他语言的多线程编程。

请注意,根据设计,JavaScript不支持多个线程。尽管它支持Webworkers,据我所知,它可以充当线程。

因此,事件驱动并不是Node独有的,并且可以在Node中完成多线程。

因此,这里有两个问题:“事件驱动与多线程之间有什么区别”,以及“ Node与其他语言(框架)之间有什么区别”。我将重点讨论后者,因为这似乎是该问题的意图。

我要说让Node与众不同的是,作者创建它是为了避免在构建Web应用程序时阻塞IO。 Node社区的文化是强调和建立无阻塞IO的力量。您不会发现太多执行阻止呼叫的第三方库。作为使用Node的开发人员,您不太可能在代码中遇到微妙的阻塞操作。而在其他语言中,天真的开发人员可能会意外地执行效率低下的阻塞调用,例如从数据库连接中读取数据。

除此之外,您应该真正阅读有关“并发”的多种模型,并了解每种模型的优缺点。欣赏为什么这么长时间可以接受多线程的好处。



回答 3:

概念上的差异很容易使您头脑清醒。

在事件驱动的体系结构中,您的程序在连续的单线程循环中运行(您可以在节点中执行一些多线程操作,但现在不必担心)。当事件触发时,将在调用堆栈中处理一项工作,以便在程序空闲时进行处理。

多线程体系结构通常在必须等待操作时调度新线程。因此,您对数据库进行调用,然后启动一个新线程,该线程将执行您需要的所有事情并执行您需要做的事情,并结束或重新加入原始线程。

这两种方法对于不同的事物都非常有用。事件驱动非常适合用户界面和服务器,因为您的程序不知道何时会发生偶数偶发事件,并且事件常常会突发。虽然线程对于需要将问题分解成更小的部分(或者您正接近单线程循环的极限)的计算繁重的工作是必需的。