node.js的一个多线程版本

A version of node.js that is multi-threaded?

本文关键字:一个 多线程 版本 js node      更新时间:2023-09-26

node.js是单线程的,遵循事件模型,这很好,但除此之外,它对我没有多大帮助。我有很多cpu密集型任务,我希望每个服务器请求都在单独的线程中处理。有人创建了一个多线程的node.js分支吗?

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

常见的解决方案是使用内置的集群模块或一些第三方库生成几个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受限的任务(例如计算)。所以,如果处理每个请求都需要大量的计算,那么你选错了工具。

考虑使用IISNode。摘自hanselman的博客:

多核服务器上的可伸缩性。因为node.exe是单线程的进程,它只能扩展到一个CPU核心。iisnode模块允许为每个应用程序和负载创建多个node.exe进程在它们之间平衡HTTP流量,因此启用full服务器CPU容量的利用率,而不需要额外的来自应用程序开发人员的基础架构代码。

可能是的,例如查找一组库

  • 流行线程模块- Node.js

和这篇文章(2014年3月3日)

    JXcore -一个带有多线程的Node.JS发行版

线程和纤维是从第一个Node.js开始就被问到的问题(至少谷歌说的似乎表明至少对我来说是这样)。

ES6假定许多并发需求将由生成器和承诺解决,因此从未来的角度来看,围绕线程的概念设计服务器端可能会成为一个长期的问题。

Google的Dart(下一代web语言)也将并发建模为通过一些简单的消息传递进行通信的独立实体(isolate)。参见https://www.dartlang.org/docs/spec/latest/dart-language-specification.html Concurrency章节。

相反,通常的threads模型期望某种shared memory。它在集群模式下不可用,在Dart中也不可用(至少很快)。

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

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

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

你看到这篇文章了吗?:如何通过几行代码将现有应用程序转换为多线程应用程序!

它运行一个多线程的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选择这三个线程中的一个来处理每个请求。