191103의 메모

자바스크립트의 동시성

동기 모델의 단점

  • 다른 언어의 멀티 쓰레드를 이용하는 동기 모델의 경우 각 쓰레드별로 메모리를 점유하게 되고 context switching이 발생하게 되면서 메모리와 cpu에 대한 오버헤드가 발생한다.

콜백

  • Just pass a function that will be called when the task is complete.
1
2
3
4
// file.txt의 읽기가 끝났을 때 읽어온 content를 인자로 미리 예약된 callback을 호출한다.
readFile('file.txt', (content) => {
console.log(content);
})

단점

  • 어떤 일을 순차적으로 동작시키거나, 병렬로 동작시키는게 어렵다.
  • for/while try/catch 구조를 포기하게 만든다.
  • 에러 핸들링이 어렵다.
  • 코드 가독성이 떨어진다.

프로미스

무엇을 해결했나

  • 순차적, 병렬적 작업들의 쉬운 연결.
  • 에러 핸들링
1
2
3
4
5
// Promise style
readFile('confing.json')
.then(...)
.then(...) // 순차적 실행
.catch(...); // 에러 핸들링
1
2
3
4
5
6
7
8
9
10
11
12
fetchJSON('/user-profile')
.then(user => {
return fetchJSON(`/users/${user.id}/friends`);
})
.then(friendsIDs => {
let promises = friendIDs.map(id => {
return fetchJSON(`/users/${id}`);
});

return Promise.all(promises);
})
.then(friends => console.log(friends));

이벤트루프

  • 이벤트루프는 자바스크립트 런타임이 아닌 호스팅 환경에 종속된다.
  • 이벤트루프를 통해 각 호스팅 환경의 방법으로 이벤트를 스케쥴링하게된다.

JS엔진이 호스팅환경에게

“이봐 나는 이제 코드 수행을 중지시킬 거야. 하지만 자네는 네트워크 요청이 모두 끝나면 가져온 데이터를 이용해 이 함수를 호출(call back)해주게.”
출처 : 자바스크립트는 어떻게 작동하는가: 이벤트 루프와 비동기 프로그래밍의 부상, async/await을 이용한 코딩 팁 다섯 가지

이벤트루프의 임무

콜스택과 콜백 큐를 모니터링한다.
콜스택이 비었을 때, 콜백 큐의 첫번째 이벤트 핸들러를 실행시킨다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×