掌握Node JS替代多线程的方法

时间:2011-03-05 00:43:27

标签: multithreading node.js

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

它也是单线程的。

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

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

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

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

5 个答案:

答案 0 :(得分:85)

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

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

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

答案 1 :(得分:36)

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

  

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

答案 2 :(得分:26)

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

当然,你可以做更多的任务。文档为here

关于该主题的文章很少:

答案 3 :(得分:13)

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

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

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

答案 4 :(得分:1)

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

Click here to see the video

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