关于 Deno Watch Mode 信号问题的更新

发布: (2025年12月14日 GMT+8 12:34)
2 min read
原文: Dev.to

Source: Dev.to

在 Deno 中有一个 issue,信号处理程序在监视模式下无法工作。我认为这是因为 Deno 文件监视器没有向工作线程发送 INT 信号,导致它直接停止。现在我对此很有信心。

Source in Deno

select! {
    _ = receiver_future => {},
    _ = deno_signals::ctrl_c() => {
        return Ok(()); // this line handled the INT signal and fulfilled select!
    },
    _ = restart_rx.recv() => {
        print_after_restart();
        continue;
    },
    success = operation_future => { /* ... */ }
}

在 Deno 代码中,select! 语句的行为类似于 JavaScript 的 Promise.any。它会在 INT 信号被忽略时立即完成。operation_future 负责运行用户的 JavaScript 或 TypeScript 文件,但它没有机会触发用户自定义的监听器。

How Node.js Handles Signals in Watch Mode

Node.js 会将信号发送给工作线程,并等待工作线程结束。

async function killAndWait(signal = kKillSignal, force = false) {
  child?.removeAllListeners();
  if (!child) {
    return;
  }
  if ((child.killed || exited) && !force) {
    return;
  }
  const onExit = once(child, 'exit');
  child.kill(signal);
  const { 0: exitCode } = await onExit;
  return exitCode;
}

source

Proposed Approach for Deno

我计划采用类似的策略:将信号发送给工作线程以触发监听器,然后等待其完成。这样可以让用户自定义的信号处理程序在监视模式下正常运行。

Back to Blog

相关文章

阅读更多 »