Javascript 如何让express Node.JS在繁重的工作负载下回复请求?

Javascript 如何让express Node.JS在繁重的工作负载下回复请求?,javascript,node.js,express,Javascript,Node.js,Express,我正在创建一个nodejs web处理器。我的处理时间约为1分钟。我POST到我的服务器并使用get 这是我的简化代码 // Configure Express const app = express(); app.listen(8080); // Console app.post('/clean, async function(req, res, next) { // start proccess let result = await worker.process(data

我正在创建一个nodejs web处理器。我的处理时间约为1分钟。我
POST
到我的服务器并使用
get

这是我的简化代码

// Configure Express
const app = express();
app.listen(8080);

// Console
app.post('/clean, async function(req, res, next) {

    // start proccess
    let result = await worker.process(data);

    // Send result when finish
    res.send(result);
});

// reply with when asked
app.get('/clean, async function(req, res, next) {
    res.send(worker.status);
});
问题是。服务器在
POST/clean
过程中工作非常努力,以至于
GET/clean
没有及时回复

所有
GET/clean
请求都会在工作人员完成任务并释放处理器响应请求后得到响应

换句话说。应用程序在工作负载期间无法响应


我怎样才能避免这种情况?

除了将服务转换为一组进程或使用类似实验性的东西之外,没有办法解决JS的单线程特性

如果这两个选项都不适用于您,则您需要定期放弃处理线程,以使其他任务能够处理以下事项:

function workPart1() {
  // Do a bunch of stuff
  setTimeout(workPart2, 10); 
}
function workPart2() {
  // More stuff
  setTimeout(workPart3, 10); // etc. 
}

除了将您的服务转换为一个进程集群或使用类似实验性的东西之外,没有办法解决JS的单线程特性

如果这两个选项都不适用于您,则您需要定期放弃处理线程,以使其他任务能够处理以下事项:

function workPart1() {
  // Do a bunch of stuff
  setTimeout(workPart2, 10); 
}
function workPart2() {
  // More stuff
  setTimeout(workPart3, 10); // etc. 
}

由于node.js以单线程方式运行Javascript(一次只运行一段Javascript),并且不分时间,只要
worker.process()
正在运行同步代码,服务器就不能处理其他请求。这就是为什么
worker.process()
必须在运行时到达的任何http请求得到服务之前完成。node.js事件循环在
worker.process()
完成之前一直处于忙碌状态,因此无法为任何其他事件(如传入的http请求)提供服务

以下是解决这一问题的一些方法:

  • 使用内置的群集模块对应用程序进行群集,这样您就有了一组进程,可以处理
    worker.process()
    code或处理传入的http请求

  • 调用
    worker.process()
    时,启动一个新的node.js进程,在那里运行处理,并使用标准进程间通信返回结果。然后,main node.js进程保持读取状态,以便在传入http请求到达时立即处理它们

  • 创建一组其他node.js进程的工作队列,这些进程运行放入队列中的作业,并将这些进程配置为能够从队列中运行
    worker.process()
    代码。这是#2的一个变体,它限制进程的数量并将工作序列化到队列中(比#2更好地控制)

  • 重做
    worker.process()
    的工作方式,这样它一次可以做几毫秒的工作,然后返回到消息循环,这样其他事件就可以运行(比如传入的http请求),然后再继续工作几毫秒。这通常需要构建某种类型的有状态对象,每次调用该对象时都可以执行一点工作,但要有效地进行编程通常是一件痛苦的事情


  • 注意#1、#2和#3都要求在其他过程中完成工作。这意味着
    process.status()
    需要从其他进程获取状态。因此,您要么需要某种进程间方式与其他进程通信,要么需要将状态存储在可从所有进程(如redis)访问的某个存储中,以便从该存储中检索。

    因为node.js将Javascript作为单线程运行(一次只运行一段Javascript)并且不分时间,只要
    worker.process()
    运行同步代码,服务器就不能处理其他请求。这就是
    worker.process()的原因
    必须在运行时到达的任何http请求得到服务之前完成。node.js事件循环一直很忙,直到
    worker.process()
    完成,因此它无法服务任何其他事件(如传入的http请求)

    以下是解决这一问题的一些方法:

  • 使用内置的群集模块对应用程序进行群集,这样您就有了一组进程,可以处理
    worker.process()
    code或处理传入的http请求

  • 调用
    worker.process()
    时,启动一个新的node.js进程,在那里运行处理,并使用标准进程间通信返回结果。然后,主node.js进程保持读取状态,以便在传入http请求到达时立即处理它们

  • 创建一组额外node.js进程的工作队列,这些进程运行放入队列中的作业,并将这些进程配置为能够从队列中运行
    worker.process()
    代码。这是#2的一个变体,它限制进程的数量并将工作序列化到队列中(比#2更好地控制)

  • 重做
    worker.process()
    的工作方式,以便一次可以完成几毫秒的工作,然后返回到消息循环,以便运行其他事件(如传入的http请求)这通常需要构建某种有状态的对象,每次调用它时都能做一点工作,但要有效地编程通常是一件痛苦的事情

  • 请注意#1、#2和#3都要求在其他进程中完成工作。这意味着
    process.status()
    需要从其他进程获取状态。因此,您需要某种进程间方式与其他进程通信,或者需要将状态存储在所有进程都可以访问的存储中(例如