掌握 NodeJS 替代多线程的方法

如果我理解正确的话,Node JS 是非阻塞的... ... 因此它没有等待来自数据库或其他进程的响应,而是转移到了其他地方,稍后再检查。

而且它是单线程的。

所有这些是否意味着给定的 Node JS 进程可以完全有效地利用单个 CPU 核心,但是它不会使用机器上的任何其他核心,因为它永远不会一次使用多个 CPU 核心。

这当然意味着其他 CPU 仍然可以被其他进程使用,如 SQL 数据库或其他有意分离的 CPU 重子例程,只要它们是一个单独的进程。

另外,如果 Node JS 进程具有无穷循环或长时间运行的函数,那么在无穷循环或长时间运行的函数停止(或整个进程被终止)之前,该进程在任何方面都不再有用。

这样对吗? 我的理解正确吗?

65954 次浏览

是的,我认为你的理解是完全正确的。这篇文章(存档)很好地解释了这种设计背后的基本原理。这可能是最重要的一段:

Apache 是多线程的: 它为每个请求(或进程,它依赖于 conf)生成一个线程。您可以看到,随着并发连接数量的增加以及需要更多线程来服务多个同时发生的客户端,这种开销如何消耗内存。Nginx 和 Node.js 并不是多线程的,因为线程和进程需要消耗大量的内存。它们是单线程的,但是基于事件。这样可以通过在一个线程中处理多个连接来消除由数千个线程/进程造成的开销。

非常正确,是的。Js 服务器有一个内部线程池,因此它可以执行阻塞操作,并在完成任务时通过回调或事件通知主线程。

所以我猜想它将有限地使用另一个内核作为线程池,例如,如果你做一个非阻塞的文件系统读取,这可能是通过告诉线程池中的一个线程执行一个读取,并设置一个回调,当它完成时,这意味着读取可能发生在另一个线程/内核上,而主 node.js 程序正在做其他事情。

但是从 node.js 的角度来看,它完全是单线程的,不会直接使用多个内核。

自从这个问题问了差不多两年。事情正在发生变化,或者 Node.JS 上存在解决多线程问题的替代方法

根据下面的博客文章,使用传入的“任务”扩展,一些可以直接受益于其他可用的核心。

Http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

即使这是一个老线程,我想,我会分享一个想法,如何利用更多的一个核心在 Node.JS 应用程序。正如阿尔丁提到的-JXcore可以做到这一点。

举个简单的例子:

var method = function () {
console.log("this is message from thread no", process.threadId);
};


jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);


// this is message from thread no 1
// this is message from thread no 0

默认情况下有两个线程(您可以用 jxcore.tasks.setThreadCount()更改它)

当然还有更多的任务可以完成,文档是 给你

关于这一主题的文章寥寥无几:

Js 是一个单线程应用程序,但它可以通过事件和回调的概念支持并发。下面是 菲利普 · 罗伯茨的视频,它解释了 javascript 中的事件循环是如何工作的。

点击这里查看视频

(Node.js 中没有使用 WebAPI,而是使用了 C + + API)