Node.js 中如何真正的 Graceful shutdown
发布于 7 年前 作者 cheeeeetah 5456 次浏览 来自 问答
const Koa = require('koa')
const sleep = require('sleep-promise')

const app = new Koa()

async function asyncWork() {
  await sleep(10000)
  console.log('Done async work')
}

app.use(async ctx => {
  console.log('got request')
  asyncWork().catch(console.error)
  ctx.body = 'Hello World'
})

app.listen(3000)

当停掉这个 server 时(SIGTERM 或 SIGINT),不管 asyncWork 有没有完成, node 进程都会立刻退出,如何等待 asyncWork 完成再退出?

注意:asyncWork 是特意没有 await 的,有 await 的情况我知道如何 graceful shutdown

6 回复

pm2进程管理是可以实现的

这个问题需要知道当前正在执行的异步任务有哪些,以及哪些异步任务是循环执行的,比如setInterval 目前我是不知道有什么办法能够获取到,可以考虑只对重要的任务做特殊处理,其它不重要的就不管了

@jjeejj 如何实现呀?

看你的标题还以为是pm2,你的意思是说 app.use(async ctx => { console.log(‘got request’) asyncWork().catch(console.error) ctx.body = 'Hello World’ shutdown ? }) 不是很理解你这里的停掉这个server 是什么意思 我猜可能有两种情况,一种是我上面说的,你在asyncWork执行后同一个代码块里进行shutdown,这里你可以在shutdown之前await一下 另一种是你在另一个地方监听SIGINT关闭,这里需要你存储一下asyncWork的执行句柄,然后在接收到关闭信号后await一下

process.on(“beforeExit”)

来自酷炫的 CNodeMD

说错了, process.on(“sigint”)

来自酷炫的 CNodeMD

回到顶部