Space
article thumbnail
Published 2023. 6. 21. 09:05
[JS] 비동기 JavaScript
반응형

동기와 비동기

동기

(Synchronous)

 

특정 코드의 실행이 완료될 때까지 기다리고 난 후 다음 코드를 수행하는 것

 

주문 즉시 커피를 만들어 주는 카페가 있다고 가정해 봅시다.

동기적으로 운영되는 카페의 경우

음료를 주문받은 후 주문 받은 음료를 만들어 손님에게 전달한 후

다음 손님의 주문을 받고 음료를 제작하게 됩니다.

이러한 방법은 여러 손님의 주문을 소화하기가 어려우며 비효율적입니다.

 


비동기

(Asynchronous)

 

특정 코드의 실행이 완료될 때까지 기다리지 않고 다음 코드들을 수행하는 것

 

앞선 예시로 든 카페가 비동기적으로 운영되는 경우

여러 손님의 주문을 받으면서 음료를 제작하게 되고

완성되는 대로 손님에게 음료를 제공하게 됩니다.

이러한 방법은 동기적으로 운영하는 경우보다 훨씬 효율적입니다.

 

반응형

코드로 보는 동기, 비동기

 

자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택을 갖는다.

이는 함수를 실행할 수 있는 창구가 단 하나이며,

2개 이상의 함수를 동시에 실행할 수 없다는 것을 의미한다.

 

이처럼 자바스크립트 엔진은

한 번에 하나의 테스크(task)만 실행할 수 있는

싱글 스레드(single thread) 방식으로 동작한다.

 

싱글 스레드 방식은 한 번에 하나의 테스크만 실행할 수 있기 때문에

처리에 시간이 걸리는 테스크를 실행하는 경우 블로킹(blocking, 작업 중단)이 발생한다.


동기

 

예를 들어 setTimeout 함수와 유사하게 일정 시간이 경과한 후에

콜백 함수를 호출하는 sleep 함수를 구현해 보자.

// 동기적 처리 example

// sleep 함수는 일정 시간(delay)이 경과한 이후에 콜백 함수(func)를 호출한다.
function sleep(func, delay) {
    // Date.now()는 현재 시간을 숫자(ms)로 반환한다.
    const delayUnitl = Date.now() + delay;
    
    // 현재 시간(Date.now())에 delay를 더한 delayUntil이 현재 시간보다 작으면 계속 반복한다.
    while(Date.now() < delayUntil);
    
    // 일정 시간(delay)이 경과한 이후에 콜백 함수(func)를 호출한다.
    func();
}

function foo() {
    console.log('foo');
}

function bar() {
    console.log('bar');
}

// sleep 함수는 3초 이상 실행된다.
sleep(foo, 3000);

// bar 함수는 sleep 함수의 실행이 종료된 이후에 호출되므로 3초 이상 블로킹된다.
bar();


비동기

// 비동기적 처리 example

function foo() {
    console.log('foo');
}

function bar() {
    console.log('bar');
}

// 타이머 함수 setTimeout은 일정 시간이 경과한 이후에 콜백 함수 foo를 호출한다.
// 타이머 함수 setTimeout은 bar 함수를 블로킹하지 않는다.
setTimeout(foo, 3000);
bar();


 

 

비동기 알아보는 시간이었습니다.

틀린 내용은 댓글로 알려주시면 감사하겠습니다.

 

 

반응형
profile

Space

@Space_zero

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!