Deno Watch Mode 신호 문제에 대한 업데이트
Source: Dev.to
Deno에는 워치 모드에서 신호 핸들러가 작동하지 않는 이슈가 있습니다. 이는 Deno 파일 감시자가 INT 신호를 워커에 전달하지 않아 워커가 그냥 중단되기 때문이라고 생각합니다. 이제 이 점에 대해 확신합니다.
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 파일을 실행하지만, 사용자 정의 리스너가 활성화될 기회를 얻지 못합니다.
Node.js가 워치 모드에서 신호를 처리하는 방법
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;
}
Deno를 위한 제안된 접근 방식
저는 비슷한 전략을 채택하려고 합니다: 신호를 워커에 전달해 리스너를 트리거하고, 그 워커가 작업을 마칠 때까지 기다리는 것입니다. 이렇게 하면 워치 모드에서도 사용자 정의 신호 핸들러가 올바르게 실행될 수 있을 것입니다.