gpt4 book ai didi

node.js - 如何在 Node JS 中执行/中止长时间运行的任务?

转载 作者:IT老高 更新时间:2023-10-28 13:28:08 35 4
gpt4 key购买 nike

具有 Mongo DB 的 NodeJS 服务器 - 一个功能将从 DB 生成报告 JSON 文件,这可能需要一段时间(60 秒以上 - 必须处理数十万个条目)。

我们希望将其作为后台任务运行。如果用户决定更改参数并重新构建它,我们需要能够启动报表构建过程、监控它并中止它。

Node 最简单的方法是什么?不想进入单独的工作服务器处理作业、消息队列等领域 - 我们需要将其保持在同一个盒子上并且实现相当简单。

1) 以异步方法启动构建,并返回给用户,socket.io 报告进度?

2) 为构建脚本分离一个子进程?

3) 使用类似 https://www.npmjs.com/package/webworker-threads 的内容?

通过我研究过的几种方法,我陷入了相同的两个领域;

1) 如何监控进度?2) 如果用户重新提交数据,如何中止现有的构建过程?

任何指针将不胜感激......

最佳答案

最好将此任务与您的主应用程序分开。也就是说,在后台运行它很容易。要在后台运行它并在没有消息队列等的情况下进行监控,最简单的方法是 child_process

  1. 您可以在用户调用的端点(或 url)上启动 spawn 作业。
  2. 接下来,设置一个socket来返回对子进程的实时监控
  3. 添加另一个端点以停止作业,由 1. 返回唯一的 id(或不添加,取决于您的并发需求)

一些编码思路:

var spawn = require('child_process').spawn

var job = null //keeping the job in memory to kill it

app.get('/save', function(req, res) {

if(job && job.pid)
return res.status(500).send('Job is already running').end()

job = spawn('node', ['/path/to/save/job.js'],
{
detached: false, //if not detached and your main process dies, the child will be killed too
stdio: [process.stdin, process.stdout, process.stderr] //those can be file streams for logs or wathever
})

job.on('close', function(code) {
job = null
//send socket informations about the job ending
})

return res.status(201) //created
})

app.get('/stop', function(req, res) {
if(!job || !job.pid)
return res.status(404).end()

job.kill('SIGTERM')
//or process.kill(job.pid, 'SIGTERM')
job = null
return res.status(200).end()
})

app.get('/isAlive', function(req, res) {
try {
job.kill(0)
return res.status(200).end()
} catch(e) { return res.status(500).send(e).end() }
})

要监控子进程,您可以使用 pidusage , 我们在 PM2 中使用它例如。添加一条路线来监控作业并每秒调用一次。作业结束时不要忘记释放内存。


您可能想查看 this library这将帮助您管理跨微服务的多处理。

关于node.js - 如何在 Node JS 中执行/中止长时间运行的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29896854/

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