You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:25:29