掌握Node JS替代多线程


142

如果我正确理解Node JS不会阻塞...,那么它就不必等待数据库或其他进程的响应,而是继续进行其他操作并稍后再检查。

它也是单线程的。

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

当然,这意味着其他进程仍可以将其他CPU用于其他事物,例如SQL数据库或其他有意分离的CPU重子例程,只要它们是独立的进程即可。

同样,如果Node JS进程具有无限循环或长时间运行的功能,则在停止无限循环或长时间运行的功能(或终止整个进程)之前,该进程将不再有用。

这一切对吗?我的理解正确吗?


2
“节点” 不是单线程的。仅JS / V8引擎在单个线程中运行。NodeJS的libuv部分是多线程的。请参见NodeJS真的是单线程的吗?
RaelB

Answers:


87

是的,非常正确。node.js服务器具有内部线程池,因此它可以执行阻止操作,并在事情完成时通过回调或事件通知主线程。

因此,我想它会在线程池中有限地使用另一个内核,例如,如果您执行非阻塞文件系统读取,则很可能是通过告诉线程池中的线程执行读取并设置回调来实现的完成后,这意味着在主node.js程序执行其他操作时,读取可能在其他线程/内核上进行。

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


2
我还是Node.js的新手,非常感谢这里的讨论。我只是想指出,假设非阻塞调用由线程阻塞调用作为后盾可能是不明智的(不是@jcoder建议围绕这些假定构造代码)。在这种情况下,即使IO是通过阻塞调用在单独的线程上处理的,该线程基本上也将一直在IO上等待,因此不会使用其他内核/ CPU。使用您正在使用的工具的强度进行编码,不必太担心底层细节(直到它们成为问题)。
wbyoung 2014年

因此,我们可以使用前端上的javascript代码之类的回调进行其他处理
yussan

37

是的,我想说您的理解是完全正确的。本文已存档)很好地解释了此设计的原理。这可能是最重要的一段:

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


这篇文章是错误的。尽管存在多线程apache mpm,但实际上它与所有日常使用的配置都不兼容。Apache是​​多进程的,直到现在还没有多线程,并且可能会永远存在。我发现这是灾难性的,操纵术语的正确含义只是隐藏问题而不是解决问题的一种不错的尝试。
peterh-恢复莫妮卡

1
@peterh你没有道理。本文完全正确,指出apache是​​多进程或多线程的,具体取决于配置。就处理许多连接而言,多进程情况甚至更糟,这是首先提到Apache的唯一原因。此外,非常常用的PHP模块本身就是多线程的。最后,虽然我不是一位Apache专家,但我从其他文章中得出的印象是,工人MPM实际上是非常常用的。
Michael Borgwardt

@MichaelBorgwardt是的,apache可以是多线程的,也可以是多进程的,我没有否认。但是php与多进程配置不兼容,如果您是apache专家,那么您一定会知道的。非常常用的php模块不是多线程的。您的信息是错误的。我建议尝试测试配置,您将看到。这是事实而不是辩论,尝试一下,您会看到的。
peterh-恢复莫妮卡

27

我想,即使这是一个老话题,我也将分享一个想法,即如何在Node.JS应用程序中利用更多的一个核心。正如Nuray Altin提到的那样-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()

当然,您可以执行更多任务。文档在这里

关于该主题的文章很少:



1

Node.js是一个单线程应用程序,但是它可以通过事件和回调的概念来支持并发。这是Philip Roberts的视频,解释了事件循环如何在javascript中工作。

点击这里观看视频

(Node.js中有C ++ API而不是WebAPI)


2
这应该是一条评论
切尔诺夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.