gpt4 book ai didi

javascript - 如何让Node.JS在工作负载繁重时回复请求?

转载 作者:行者123 更新时间:2023-12-01 01:39:43 25 4
gpt4 key购买 nike

我正在创建一个 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 请求都会在工作线程完成其任务后得到回复,并释放处理器来响应请求。

enter image description here

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

如何解决这种情况?

最佳答案

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

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

  1. 使用内置集群模块对您的应用进行集群,以便您拥有一堆可以处理 worker.process() 代码或处理传入 http 请求的进程。

  2. 当需要调用worker.process()时,启动一个新的node.js进程,在那里运行处理并通过标准进程间通信传回结果。然后,您的主 Node.js 进程会保持读取状态,以便在传入的 http 请求到达时立即对其进行处理。

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

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

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

关于javascript - 如何让Node.JS在工作负载繁重时回复请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com