关于 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;
}
Proposed Approach for Deno
我计划采用类似的策略:将信号发送给工作线程以触发监听器,然后等待其完成。这样可以让用户自定义的信号处理程序在监视模式下正常运行。