엥더맨
83
2019-07-08 19:15:49
3
349

노드js 관련 질문입니다.(비동기, 논블록킹 관하여)


제가 비동기랑 동기의 개념을 잡고 블로킹 논블록킹 개념을 잡은뒤 궁금한 부분이 있어서 질문드립니다.



function getNumber(preNumber){

	let pr = new Promise((resolve, reject) => {
		if(preNumber > 1000)
			resolve(preNumber + 1000);
		else
			reject("no number");
	});

	return pr;
}

async function logger() {
	try{
		console.log("로거 안");
		let number = await getNumber(1001);
		let number2 = await getNumber(2001);
		console.log("number : " + number);
		console.log("number2 : " + number2);

		console.log("number +  number2 = " + (number + number2));
	}catch(err){
		console.error(err);
	}
}

logger();
console.log("로거 호출 후");


웨 소스에서 logger함수는 await가 실행될때 바로 리턴을 하므로 논블로킹이라고 부를수 있다고 봅니다. 그러면 logger함수 안에 await구문 자체는 블로킹 코드로 생각됩니다.

그 이유는 await구문이 실행되면 getNumber(1001) 함수가 바로 리턴되지 않고 완료 될 때 까지 기다렸다가 다음 줄인 getNumber(2002);가 실행이 되기 때문에 logger함수 안에 await구문은 블로킹이라고 생각되는데 이게 맞는건가요?

그리고 만약 블로킹이 맞다면 await구문 자체가 비동기로 실행되어 그 이후 실행되는 로직은 이벤트 루프에서 따로 실행되는 것으로 알고 있는데 그러면 await구문은 "비동기 블로킹"이라고 봐도 되는 것일까요?


이 두가지가 맞는 것인지 궁금합니다.



0
  • 답변 3

  • 쿵따리쿵쿵따
    270
    2019-07-09 01:20:51 작성 2019-07-09 01:23:54 수정됨

    먼저 block과 non-blocking는 해당 함수가 값을 바로리턴하냐 마냐의 차이입니다.

    또한 async는 단지 비동기 코드를 좀더 우아하게 작성하기위한 문법중 하나이고 await는 Promise.then()의 축약 표현입니다. Promise.then()은 non-blocking입니다.


    1.logger함수는 async 문법으로인해 항상 Promise가 리턴됩니다. 해당함수에서 return 값이 없어도 Promise로 래핑되서 리턴됩니다. 즉 값을 사용할때는 .then()이나 await를 사용해야 합니다. 이 때문에 async는 non-blocking방식으로 작동하게 됩니다.(Promise.then은 sync방식이며 non-blocking입니다)


    2. 말했듯이 await는 Promise.then의 축약표현입니다. 바로 받는것처럼 보이지만 .then으로 인해 해당 Promise에서 결과가 주어질때까지 제어권을 넘기고 다음 문장을 실행하게됩니다.

    logger함수에서는 17번 라인을 만나는순간 제어권이 넘어가 바로 29번째 라인이 실행되고 값을 받으면 다시 17번라인으로 돌아가 실행이됩니다. non-blocking방식으로 진행됩니다




  • 엥더맨
    83
    2019-07-09 14:49:39

    쿵따리쿵쿵따

    답변 감사합니다

    await구문을 만나면 logger함수가 Promise를 리턴하기 때문에 non-blocking 이다.

    이게 맞는거겠죠?

    사실 내부적으로 await이 Promise.then()와는 달리 값을 직접 리턴하기 때문에 number변수에 바로 그 리턴값이 전달 되는 것이 아니라 getNumber()함수가 끝나야 값이 리턴되는 차이점이 있어서 이 고민을 시작하게 되었습니다.

    await구문이 무언가를 리턴하는것 뿐만 아니라 await을 만나면 async함수가 Promise객체를 리턴하는 것이 논블로킹 한 것이군요.

    답변해주신 덕분에 논블로킹이 뭔지 제대로 알고 가는 것 같습니다.

    감사합니다.

  • 쿵따리쿵쿵따
    270
    2019-07-09 17:21:17

    다행이네요 ㅎ 근데 하나 틀린게 async함수가 await구문을 만나 promise를 리턴하는게 아니라, async자체가 promise를 리턴합니다. await가 없어도 promise를 리턴합니다.


    해당코드에서 await를 전부 지우고 logger함수 값을 받아보면 promise로 나올겁니다

  • 로그인을 하시면 답변 을 등록할 수 있습니다.