Node.js支持并行吗?

我一直在研究并发和并行的区别。 Rob Pike在谈到关于并发性和并行性之间的差异时,在YouTube上发表了一个演讲。 他的演讲是在Google Go语言的背景下进行的。 据我所知,并发是能够处理多种事情的devise,而并行则是多个事物同时物理执行。

从我也明白,Node.js作为一个单线程进程运行。 因此,尽pipeNode支持并发执行callback的方式,它是否有能力处理任务的并行执行? 它可以设置为在单独的处理器上运行多个线程?

Node可以通过打包在Nodejs Core API中的Cluster或者child_process模块来支持“Parallelism”。 这两个模块创build额外的进程,而不是额外的线程。

线程被创build和pipe理,有时在一个池中,由libuv “under-the-hood”,哪个node实现并用来执行asynchronous操作,例如从文件中读取。 你不能从正在执行的Javascript中明确地创build一个线程。 您可以在下面的资源阅读更多关于libuv

  • libuv API文档
  • libuv
  • 线程libuvlibuv书的一部分)

此外,这是一个很好的问题线程和池 ,它有很多的细节。

Cluster用于将服务器的工作负载分布在多个核心之间,并仍然共享一个端口。 但是, Cluster使用child_process.fork() ,并通过进程间通信进行通信 。 您可以在Nodejs Core API文档中阅读有关Cluster更多信息。

child_process提供了几种不同的方法来通过exec()spawn()fork()来并行化工作。 父进程可以通过pipe道使用进程间通信与subprocess进行通信。

基本上,Node希望您利用事件循环并将线程pipe理libuv 。 这就是为什么构build代码通常需要locking和线程安全措施的原因。 如果您必须执行需要繁重工作或大量阻塞(同步)工作的工作,则可以使用child_process卸载该工作。 如果您需要跨核心扩展Web应用程序,请使用“ Cluster

如果我没有弄错,你正在寻找一些符合multithreading和/或同时计算多个事物的东西。

一次执行多次
SIMD开始进入浏览器,Node实现也不远。 看看node-simd或MDN SIMD(浏览器) 。 SIMD仍然是实验性的,只能在当前支持的CPU上工作(显然,因为并不是所有的CPU都有这个function)。 它一次执行多个事情,比较正常的JS和SIMD JS的例子是:

 // Normal addition, 4 actions are executed. var a = [1, 2, 3, 4]; var b = [5, 6, 7, 8]; var c = []; c[0] = a[0] + b[0]; c[1] = a[1] + b[1]; c[2] = a[2] + b[2]; c[3] = a[3] + b[3]; c; // Array[6, 8, 10, 12] // SIMD execution - all additions are processed simultaenously through the CPU var a = SIMD.Float32x4(1, 2, 3, 4); var b = SIMD.Float32x4(5, 6, 7, 8); var c = SIMD.Float32x4.add(a,b); c; // Float32x4[6, 8, 10, 12] 

multithreading
关于multithreading,networkingwebworkers已经在浏览器环境中存在了一段时间了。 这已经根据HTML规范完全移植到了这个版本库中 。
这里有一个很好的解释 ,为什么webworkers甚至移植到Node,因为你已经可以在其他线程和其他CPU上使用child_process模块运行subprocess。 node-webworker是一个很好的模块,因为每个进程都在其上下文中运行,并且在自己的node进程中运行,因此它是真正的多节点的multithreading。

因此,要在不同的CPU上运行不同的进程,您可以采用node-webworker或使用child_process来派生其他线程,以便同时使用不同的CPU核心执行单独的操作。 node-webworker可以使用熟悉的postMessage API监听事件,而child_process将通过stdin / stdout / stderr通信。

希望这能回答你的问题 :)