본문 바로가기

IT 정보

[소프트웨어 디자인] 비동기 실행은 어떻게 관리할까요?

* 본포스팅은 <예제로 배우는 소프트웨어 디자인>에서 발췌한 내용으로 작성되었습니다.

 

자바스크립트는 이벤트 루프를 중심으로 구축되었습니다. 모든 작업은 큐의 항목으로 표시되며, 이벤트 루프는 큐의 앞쪽에서 작업을 가져와 실행하고 새로 생성된 작업을 큐의 뒤쪽에 추가하여 나중에 실행하는 식의 작업을 반복적으로 수행합니다. 한 번에 하나의 작업task만 실행되며 각 작업에는 고유한 호출 스택이 있지만 작업 간에 객체를 공유할 수 있습니다

 

 

대부분의 작업은 작성된 순서대로 사용 가능한 모든 코드를 실행합니다. 예를 들어, 다음 한 줄짜리 프로그램은 Array.forEach를 사용해서 배열의 각 요소를 차례로 출력합니다.

 

 

그러나 몇 가지 특별한 내장 함수를 사용하면 Node가 작업을 전환하거나 실행 큐에 새로운 작업을 추가할 수 있습니다. 예를 들어, setTimeout은 특정 밀리초가 경과한 후 콜백 함수를 실행하도록 Node에 지시합니다. 첫 번째 인수는 인수를 받지 않는 콜백 함수이고, 두 번째 인수는 지연 시간입니다. setTimeout이 호출되면 Node는 요청된 시간 동안 콜백을 따로 설정한 다음 실행 대기열에 추가합니다. 즉, 작업이 최소 지정된 시간(밀리초) 후에 실행됩니다.

 

 인수를 받지 않는 이유는 무엇인가요?
콜백 함수에 인수를 받지 않아야 한다는 setTimeout의 요구 사항은 새로운 프로그래밍 기능이나 라이브러리가 이전의 코드와 호환성을 유지해야 한다는 프로토콜의 또 다른 예입니다. setTimeout이 처음 도입될 때 예측할 수 없는 작업을 지연시키기 위한 용도로 만들어졌기 때문에 모든 작업을 감쌀 수 있는 방법을 명시했다고 할 수 있습니다

 

다음 코드에서 볼 수 있듯이 원래 작업은 완료되기 전에 많은 새로운 작업을 생성할 수 있으며, 이런 작업은 생성된 순서와는 다른 순서로 실행될 수 있습니다.

 

 

setTimeout에 0 밀리초의 지연을 설정하면 새로운 작업이 바로 실행될 수 있지만 대기 중인 다른 작업들도 실행될 기회를 얻게 됩니다.

 

 

이 트릭을 사용해서 작업을 정의하는 콜백을 받고 다른 작업을 사용할 수 있으면 작업을 전환하는 일반적인 논블록킹 함수를 구축할 수 있습니다.

 

 

Node에 내장된 함수 setImmediate는 논블록킹 함수가 하는 일을 정확히 수행합니다. Node에는 process.nextTick도 있는데, 이 함수는 완전히 같은 일을 하지는 않는 함수로, 연습에서 그 차이점을 살펴보겠습니다

 

 


 

《예제로 배우는 소프트웨어 디자인》

예스24

 

 

반응형