掌握Node JS替代多线程

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

它也是单线程的。

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

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

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

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

番长猴子2020/04/03 12:15:46

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

点击这里观看视频

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

猪猪LEY斯丁2020/04/03 12:15:46

我想,即使这是一个旧线程,我也会分享一个想法,即如何在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()

当然,您可以对任务做更多的事情。文档在这里

关于该主题的文章很少:

米亚2020/04/03 12:15:46

自从大约2年前问这个问题。事情变得越来越不同,或者Node.JS上存在解决多线程问题的替代方法

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

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

小胖2020/04/03 12:15:46

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

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

Near泡芙2020/04/03 12:15:46

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

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

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