Deno Oak框架:调用abort后listen是否等待请求处理完成?
Deno Oak 中调用 abort 后 listen 的行为及优雅关闭方案
当你给listen()传入AbortSignal并调用abort后,await listen(...)会立即返回,不会等待正在处理的请求完成。此时Deno会直接停止接收新请求,但已经进入处理流程的请求会被强制中断,可能导致客户端收到不完整响应或错误。
如果需要实现优雅关闭,确保所有正在处理的请求完成后再终止进程,可以按以下方式处理:
- 维护一个并发请求计数器:在每个请求的中间件中递增计数器,请求处理完成(包括异常场景)后递减计数器。
- 监听
SIGTERM信号时,先停止接收新请求,再等待计数器归零,最后终止进程。
示例代码思路:
import { Application } from "https://deno.land/x/oak/mod.ts"; const app = new Application(); let activeRequests = 0; // 请求计数中间件 app.use(async (ctx, next) => { activeRequests++; try { await next(); } finally { activeRequests--; if (activeRequests === 0 && shutdownTriggered) { Deno.exit(0); } } }); // 业务路由 app.use((ctx) => { ctx.response.body = "Hello World!"; }); let shutdownTriggered = false; // 监听SIGTERM信号 Deno.addSignalListener("SIGTERM", async () => { shutdownTriggered = true; // 停止接收新请求 await app.listen({ port: 8000, signal: AbortSignal.abort() }); // 等待活跃请求处理完成 while (activeRequests > 0) { await new Promise(resolve => setTimeout(resolve, 100)); } Deno.exit(0); }); await app.listen({ port: 8000 });
你提到的Atomics方案也适用,适合更精细的并发控制,但大多数Web场景下,简单的计数器配合finally块就足够满足需求。
内容的提问来源于stack exchange,提问作者Luke Puplett
相关产品推荐
相关产品推荐

