CNode

Node.js 中如何真正的 Graceful shutdown

问答
Ccheeeeetah发布于8 年前最后回复8 年前7 回复6246 浏览0 收藏
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)

J
jjeejj#1·8 年前

pm2进程管理是可以实现的

Z
zengming00#2·8 年前

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

C
cheeeeetah#3·8 年前
引用 jjeejjpm2进程管理是可以实现的

@jjeejj 如何实现呀?

2
2linziyi2#4·8 年前

看你的标题还以为是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一下

Z
zswnew#5·8 年前

process.on("beforeExit")

来自酷炫的 CNodeMD

Z
zswnew#6·8 年前

说错了, process.on("sigint")

来自酷炫的 CNodeMD

参与回复
登录后即可参与回复。登录