一个多线程的node.js版本?

时间:2014-05-12 15:43:19

标签: javascript multithreading node.js

node.js是单线程并遵循事件模型很棒,但除此之外它对我没什么帮助。我有很多cpu绑定任务,我希望每个服务器请求在一个单独的线程中处理。有没有人创建了一个多线程的node.js fork呢?

我不是指像webworker-threads这样的模块,我需要将每个函数包装起来(对于大型项目来说这很麻烦)。我的意思是,每个请求都像大多数其他Web服务器一样作为一个单独的线程进入?

4 个答案:

答案 0 :(得分:4)

常见的解决方案是使用build-in cluster module或某些第三方库生成多个node.js线程(最多CPU核心数)。

在单独的线程中处理每个请求违反了node.js的理念,并使所有node.js优势无效。将node.js用于此类任务是没有意义的,因为有很多其他Web服务器可以做得更好。

另一方面,node.js为您提供了一种更有效的Web请求处理方式。因此,node.js不是为每个请求生成一个新线程,而是使用100%的单个CPU核心处理单个线程(或一个小线程池)中的所有请求。

您还应该记住,node.js是为处理I / O绑定任务而设计的,可以击败其中的任何其他Web服务器。但是node.js并不擅长处理CPU绑定任务(例如计算)。因此,如果处理每个请求需要大量计算,那么您选择了错误的工具。

答案 1 :(得分:1)

考虑使用IISNode。来自hanselman's blog

  

多核服务器上的可扩展性。由于node.exe是单线程的   进程,它只能扩展到一个CPU核心。 iisnode模块允许   为每个应用程序和负载创建多个node.exe进程   平衡它们之间的HTTP流量,从而实现完全   利用服务器的CPU容量而无需额外的   来自应用程序开发人员的基础架构代码。

答案 2 :(得分:1)

可能是的,看看,例如对于一组库

和本文(2014年3月3日)

线程和fibers是自第一个Node.js天以来被问到的问题(至少谷歌所说的似乎表明至少对我而言)。

ES6假设许多并发要求将由generators and promises解决,因此从未来的角度来看,围绕线程概念设计服务器端可能会成为长期存在的问题。

Google的Dart(下一代网络语言)将并发模型建模为通过一些简单的消息传递进行通信的独立实体(isolate)。请参阅https://www.dartlang.org/docs/spec/latest/dart-language-specification.htmlConcurrency

相反,threads的通常模型需要某种shared memory。这在集群模式下将无法使用,也不会在Dart中提供(至少很快)。

因此,从几个角度来看,线程请求可能会成为一个致命的架构设计问题。

(我也习惯了#34;思考线程",只是注意到它在Node.js中可能是错误的方法)

答案 3 :(得分:0)

正如xmojmr所提到的,JXcore可以做到这一点。

你看到这篇文章吗?:How to turn your existing application into a multithreaded one with a few lines of code!

它运行一个http服务器多线程,允许每个请求由任何线程处理。

只需运行此代码:

var http = require('http');
var cnt = 0;

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write("Hello world! " + cnt++);
    res.end(0);
}).listen(2000, '127.0.0.1');

使用以下命令:

$ jx mt-keep:3 hello.js

就是这样。它在一个进程内运行3个线程/实例。 JXcore选择这3个线程中的一个来处理每个请求。