关于node.js:掌握Node JS替代多线程

Grasping the Node JS alternative to multithreading

如果我理解正确Node JS是非阻塞的...所以不是等待来自数据库或其他进程的响应,而是转移到其他东西并稍后检查。

它也是单线程的。

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

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

此外,如果Node JS进程具有无限循环或长时间运行的函数,则在无限循环或长时间运行的函数停止(或整个进程被终止)之前,该进程不再有用。

这一切都好吗? 我的理解是正确的吗?


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

所以我想它会限制使用另一个核心用于线程池,例如,如果你做一个非阻塞文件系统读取,这可能是通过告诉线程池中的线程执行读取并设置回调来实现的。它已完成,这意味着当主node.js程序正在执行其他操作时,读取可能发生在不同的线程/核心上。

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


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

Apache is multithreaded: it spawns a thread per request (or process, it depends on the conf). You can see how that overhead eats up memory as the number of concurrent connections increases and more threads are needed to serve multiple simulataneous clients. Nginx and Node.js are not multithreaded, because threads and processes carry a heavy memory cost. They are single-threaded, but event-based. This eliminates the overhead created by thousands of threads/processes by handling many connections in a single thread.


即使这是一个旧线程,我想,我会分享一个想法,如何在Node.JS应用程序中使用更多的那个核心。正如Nuray Altin所说 - JXcore可以做到这一点。

简单的例子:

1
2
3
4
5
6
7
8
9
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()更改它)

当然,你可以做更多的任务。文档在这里。

关于该主题的文章很少:

  • 多线程JXcore应用程序如何从多个内核中受益。
  • 如何使用几行代码将现有应用程序转换为多线程应用程序!

因为这个问题差不多在2年前提出过。事情变得不同或者Node.JS上存在多线程问题的替代方法

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

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


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

点击这里观看视频

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