개발자

노드 공부하다가 궁금해서 질문드립니다

2023년 11월 18일조회 74

예를 들어 settimeout의 시간을 1초로 하고 1초가 지난후에 콜백함수를 실행할 시점에 call stack이 비어있지않아서 다른 함수나 코드를 실행하고있을경우에 이 1초라는 시간을 보장할 수 없는건가요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

김주호님의 프로필 사진

윗분이 설명을 잘해주셔서 답변보다는 관련 내용 공유합니다. node.js의 내용은 아니고 web api의 내용이지만요~ [requestIdleCallback] - 유휴상태일때 실행되도록 하되, option 값으로 ~ms가 넘었을 때에는 실행되게끔 설정할 수 있습니다. - https://developer.mozilla.org/ko/docs/Web/API/Window/requestIdleCallback [await scheduler.postTask] - priority에 따라 task를 추가하는 함수입니다. option값으로 우선순위와 최소 지연시간을 작성할 수 있습니다 - https://developer.mozilla.org/en-US/docs/Web/API/Scheduler/postTask [await scheduler.yield] - 진행중인 task를 잠시 중단하여 다른 task에 한번 양보한 뒤, 다시 task를 재개할 수 있도록 하는 web api입니다. - 아직 공식 표준은 아닙니다 - https://developer.chrome.com/blog/introducing-scheduler-yield-origin-trial/

김경덕님의 프로필 사진

맞습니다! 자바스크립트 언어에서도 settimeout은 정확히 그 시간에 실행되는것을 보장하지 않아요. 특히 노드에서는 이벤트루프기반의 싱글스레드이기 때문에 다른 로직이 실행되고 있다면 settimeout의 콜백 역시 큐에서 대기하고 있어야해요. 정확히는 이벤트루프에 있는 큐의 종류에 timers라는 큐의 순서가 올때까지 기다려야합니다. 참고할만한 자료들을 알려드려요. https://developer.mozilla.org/en-US/docs/Web/API/setTimeout (여기 Late timeout이라는 부분을 보시면 됩니다) https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick (이건 노드의 이벤트루프가 어떻게 동작하는지에 대한 글입니다)

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 11월 18일

JavaScript의 이벤트 루프와 비동기 작동방식에 기반해 질문에 답변하겠습니다. setTimeout 함수는 웹 API에 의해 처리되고, 설정한 시간이 지나면 콜백 함수가 태스크 큐(Task Queue)에 추가됩니다. Event loop는 Call Stack이 비었을 때 항상 Task Queue를 확인하고, 만약 함수가 있으면 그것을 Call Stack으로 옮깁니다. 따라서, setTimeout에서 설정한 시간은 적어도 설정한 시간 동안 대기하는 것을 보장하지만, 정확히 그 시간 후에 실행되는 것은 보장하지 않습니다. 만약 Call Stack에 이미 다른 작업이 차있다면, 그 작업들이 모두 완료된 후 콜백 함수가 실행되게 됩니다. 이런 식으로 JavaScript는 "비동기적(non-blocking)"으로 처리됩니다. 즉, setTimeout의 콜백이 정확한 시점에 실행될지는 JavaScript 엔진의 상태(Call Stack의 상태 등)에 따라 달라집니다. 따라서 특정 코드의 실행 완료를 보장하기 위해서 Promise나 async/await 같은 비동기 패턴을 활용하는 경우도 많습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!