掌握节点JS替代multithreading
如果我理解正确的节点JS是非阻塞的…所以,而不是等待数据库或其他进程的响应,它转移到其他的东西,稍后检查。
也是单线程的。
所有这一切意味着一个给定的节点JS过程可以完全有效地利用单个CPU核心,但是它不会使用机器上的任何其他核心,因为它永远不会一次使用多个核心。
这当然意味着其他CPU仍然可以被其他进程使用,如SQL数据库或其他有意分离的CPU重子程序,只要它们是独立的进程。
同样,如果节点JS进程具有无限循环或长时间运行的function,那么在无限循环或长时间运行function停止(或整个进程终止)之前,该进程不再有用。
这是对的吗? 我的理解是否正确?
非常正确,是的。 node.js服务器有一个内部线程池,因此它可以执行阻塞操作,并在事情完成时用callback或事件通知主线程。
所以我想象它会限制使用另一个线程池的核心,例如,如果你做一个非阻塞的文件系统读取这可能是通过告诉线程池中的线程执行读取和设置callback时实现这意味着读取可能会在不同的线程/核心上发生,而主要的node.js程序正在做其他的事情。
但从node.js的angular度来看,它完全是单线程的,不会直接使用多个核心。
是的,我会说你的理解是完全正确的。 这篇文章 ( 存档 )很好地解释了这个devise的基本原理。 这可能是最重要的一段:
Apache是multithreading的:它为每个请求产生一个线程(或进程,它依赖于conf)。 您可以看到,随着并发连接数量的增加,开销如何消耗内存,并需要更多的线程来为多个同时的客户端提供服务。 Nginx和Node.js不是multithreading的,因为线程和进程的成本很高。 他们是单线程的,但是基于事件的。 这消除了成千上万的线程/进程通过在单个线程中处理多个连接而产生的开销。
即使这是一个古老的线程,我想,我会分享一个想法,如何利用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()
来改变它)
当然,你还可以做更多的事情。 文档在这里 。
关于这个问题的几篇文章:
- multithreadingJXcore应用程序如何受益于多核 。
- 如何使用几行代码将现有的应用程序变成multithreading的应用程序!
自从两年前问起这个问题以来。 事情正在变得不同,或者在Node.JS上有多种可能的multithreading问题
根据以下博文,使用传入的“任务”扩展,有些可以直接受益于其他可用的内核。
http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html
Node.js是一个单线程应用程序,但它可以通过事件和callback的概念来支持并发。 这里是Philip Roberts的video,它解释了事件循环如何在javascript中工作。
点击此处查看video
(而不是WebAPI在Node.js中有C ++ API)