본문 바로가기
  • Seizure But Okay Developer
FrontEnd/CodeSpitz 강의 정리

동기, 비동기, blocking, non-blocking, 콜백함수 및 Promise 정리

by Sky_Developer 2019. 3. 10.

동기, 비동기, blocking, non-blocking 의 차이?


일반적인 함수는 동기화함수이자 blocking 함수.

동기화 함수 : 입력하면 return 값이 반환되는 함수. 순차적으로 실행이 됨.

비동기화 함수 : return 값이 반환되지 않고 대신 callback이 return 됨. (callback 을 return 하면 다 비동기화 함수)

순차적으로 실행이 되지 않고 중간중간에 jump를 해다님.


컴퓨터는 폰 노이만 머신 기준을 따르므로 계속 명령어를 로딩하여 실행함.

블로킹 : 어떤 명령어를 만났을 때 모든 CPU가 정지하고 그 명령어를 실행하고 있는 상태.

논블로킹 : 총 수행시간이 16.6 ms, 초당 60 프레임 내에 실행되면 논블로킹 코드로 봄.


블로킹이냐 논 블로킹이냐는 시간이 얼마나 소요됬느냐 에 따라 나누므로 구분하는 기준이 상대적임.

만약 오래 걸릴 거 같은 코드가 있어 이를 setTimeout 으로 빼놨다고 하자.

하지만 이 코드가 블로킹 또는 논블로킹 이냐는 나머지 코드들이 얼마나 시간을 소요되느냐 에 따라 달린 것.

예 : for loop 100번 도는 것은 우리가 봤을 때 논블로킹, 하지만 for loop 가 2억번 돈다면 우리는 블로킹이라고 봄.



콜백함수의 단점:

우리가 통제할 수 없는 시간에 함수가 실행이 됨. ( 나 아직 준비안됬는데 함수가 실행된다는 등)

콜백 time을 항상 조정해야 함.


준비가 됬으면 실행하되 아직 준비가 안됬다면 setinterval 같은 타이머 함수를 사용해서 loop를 돌며 기다림

이를 해결하지 못해 콜백 지옥이 형성됨.


이에 Promise는 우리에게 '반 제어권' 이란 것을 줌.

반 제어권 이란?

우리가 Promise에 then을 호출하고 싶을 때 호출할 수 있음.(우리가 같는 권한)

- Promise 객체가 만들어지는 순간 비동기가 시작됨

- Promise의 then() 을 언제 호출? 내가 결정할 수 있다.

Promise 객체를 변수에 쥐고 있다가 then()을 내가 호출하고 싶을 때 호출할 수 있음.

결국 우리에게 제어권이 왔지만 이는 '절반'의 제어권 => then() 을 호출하자 마자 그 함수가 실행이 되지 않기 때문.

* Promise가 resolve 된 상태라면 내가 then 을 호출할 때까지 resolve 된 결과를 쥐고 있다가 주지만

만약 아직 resolve 된 상태가 아니라면 then 을 호출해도 결과를 전달해주지 않음. => 반제어권


비동기 이므로 완전한 제어를 할 수 없지만 Promise로 '반' 제어권을 가지게 됨(then을 내가 원할 때 호출할 수 있는 것)

이전까지 비동기함수는 실행하면 콜백이 돌아왔고 이는 return 값이 없었음. 그러므로 이를 제어할 수 있는 동기로직을 짤 수 없었음.

'FrontEnd > CodeSpitz 강의 정리' 카테고리의 다른 글

코드스피츠 5주차 수업 정리2  (0) 2019.03.18
디자인 패턴 5주차 수업 정리  (0) 2019.03.13
80 abstract_factory  (0) 2019.03.06
Service, Controller 정리  (0) 2019.03.05
80 layering 복습 정리  (0) 2019.03.03

댓글