브라우저는 자바스크립트를 실행하기 위해 싱글 스레드를 사용한다.
때문에, 자바스크립트는 한 번에 한 가지의 일만 수행할 수 있다.
비동기 처리를 통해 기다리는 시간을 줄이더라도, 결국 메시지 큐에 쌓인 업무들은 Run to Completion 원칙에 따라 동작합니다.
"Run-to-completion"
각 메시지는 다른 메시지가 처리되기 전에 완전히 처리됩니다.
이것은 함수가 실행될 때마다 미리 비워질 수 없고 다른 코드가 실행되기 전에 완전히 실행되며 함t수가 조작하는 데이터를 수정할 수 있다는 사실을 포함하여 프로그램에 대한 추론을 할 때 좋은 속성을 제공합니다. 이것은 C와는 다릅니다. 예를 들어 함수가 쓰레드에서 실행된다면 런타임 시스템이 다른 쓰레드에서 다른 코드를 실행하기 위해 어느 시점에서 멈출 수 있습니다.
이 모델의 부정적인 면은 어떤 메시지가 완료되기 까지 지나치게 오래 걸린다면 웹 어플리케이션은 클릭이나 스크롤과 같은 사용자 인터랙션을 처리할 수 없게 됩니다. 브라우저는 이러한 상황을 "a script is taking too long to run"과 같은 대화상자로 완화 합니다. 추천되는 좋은 방법은 메시지 처리를 짧도록 만드는 것과 하나의 메시지를 여러개의 메시지로 나누는 것 입니다.
웹 워커는 이러한 문제를 완전히 다른 차원으로 해결합니다. 워커는 또다른 자바스크립트 런타임입니다. 자신의 스택, 힙, 메시지 큐를 가지고 있습니다. 두 별개의 런타임들은 메세지 API를 이용하여 통신할 수 있습니다.
웹 워커 | 서비스 워커 | |
동작 | 메인 스레드 블록 없이, 추가 스레드에서 실행 | |
객체 접근 | Window, Document 접근 불가능. DOM 직접 연결 불가능, Browser API 제한적 사용 | |
네트워크 | 인터셉트 가능 | |
관계 | 페이지당 여러개 | 모든 황성 탭 제어 |
종료 | 탭 | 독립적 |
사용처 | ||
참조 | https://github.com/GoogleChromeLabs/comlink |
'개발 이야기 > JavaScript' 카테고리의 다른 글
Prometheus 프로메테우스를 이용한 Node 모니터링 (0) | 2022.09.08 |
---|---|
리코일을 이용한 비동기 처리 (0) | 2022.09.08 |
Babel - Typescript - React (0) | 2021.02.19 |
Rxjs 기본 (0) | 2020.08.24 |
@storybook/react (0) | 2020.06.02 |