我一直在研究并发和并行之间的区别。我遇到了 talk on YouTube Rob Pike 谈到并发性和并行性之间的差异。他的演讲是在 Google Go 语言的背景下进行的。据我了解,并发是能够处理多个事物的设计,但并行性是同时物理执行多个事物。
据我了解,Node.js 作为单线程进程运行。那么,虽然 Node 通过实现回调等方式支持并发,但它是否有能力处理任务的并行执行呢?是否可以设置为在不同的处理器上运行多个线程?
最佳答案
Node 可以通过 Nodejs Core API 中打包的 Cluster
或 child_process
模块支持“并行”。这两个模块都创建了额外的进程,而不是额外的线程。
线程由 libuv
创建和管理,有时在池中,由 node
实现并用于执行异步操作,例如读取从一个文件。 您无法从执行的 Javascript 中显式创建线程。您可以在以下资源中阅读有关 libuv
的更多信息
-
libuv
API Docs -
libuv
book - Threading in
libuv
(libuv
书的一部分)
另外,这是关于 Threads and Pooling 的好问题其中有很多细节。
Cluster
用于将服务器的工作负载分布在多个核心上,并且仍然让它们共享一个端口。但是,Cluster
在后台使用 child_process.fork()
并通过 inter-process communication 进行通信.您可以阅读有关 Cluster
in the Nodejs Core API Docs 的更多信息.
child_process
通过 exec()
提供了几种不同的并行工作方式, spawn()
或 fork()
.父进程可以通过管道使用进程间通信与子进程通信。
基本上,Node 希望您利用 the event loop并将线程管理留给 libuv
。这就是为什么构建通常需要锁定和线程安全措施的代码如此容易的原因。如果您必须完成需要繁重的工作或大量阻塞(同步)工作,那么您可以使用 child_process
来卸载该工作。如果您需要跨内核扩展 Web 应用程序,请使用 Cluster
。
关于node.js - Node.js 是否支持并行性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39584439/