Thread.sleep()과 Task.delay()의 차이점

FAST FOX·2023년 3월 20일
0

학습일지

목록 보기
21/39
post-thumbnail

sleep과 delay

Thread.sleep() : 동기함수이며, 지정한 ms동안 스레드를 차단하는 함수이다.

Task.delay() : 비동기 함수이며, 현재 스레드를 차단하지 않고 논리적 지연을 원할 때 사용하는 함수이다.

위에서 설명한 두개의 함수 모두 '지연'이라는 공통된 기능을 할 수 있다.
하지만 둘의 차이점으로 중요한 것은 '동기적'이냐 '비동기적'이냐이다.

우선 '동기적'이라는 말은 선행작업이 끝나지 않는다면 그 다음작업을 시작할 수 없다는 것이고, '비동기적'이라는 말은 선행작업과 상관없이 다른 작업을 하고 있다가 요청했던 작업이 끝나면 그에 대한 추가 작업을 수행하는 방식을 의미한다.

이렇게 sleep은 동기적 함수이기 때문에 sleep함수로 지연이 걸린동안 스레드를 차단해서 멍청하게 끝날 때까지 아무것도 하지않고 마냥 기다리게 된다.

하지만 delay함수의 경우에는 스레드 자체를 차단시키지 않고 await가 걸리는 시점에서 함수 호출자는 return이 되고 그 다음 과정을 처리하게된다. 그리고 함수의 결과가 오면 그 다음 작업을 처리하는 것이다.

await sleep()

sleep함수가 위에서 설명한 것처럼 스레드 자체를 멈추게끔 작동하는 것은 다른 언어에서 작동하는 방법이다.
반면, JavaScript에서는 setTimeout같은 것들이 있고 이런 것들도 결국에는 함수를 등록시켜 뒀다가 몇 초 뒤에 실행시키는 방식이므로 JavaScripts에서는 거의 '무조건' 비동기식으로 작동한다는 것을 알 수 있다.
즉 sleep을 구현한다 하더라도 진정한 sleep의 방식이라고 하기는 어렵다는 것이다.

function test(){
  console.log("시작");
  setTimeout(() => console.log("대기"), 3000);
  console.log("종료");
}

// 시작
// 종료
// 대기
// 결국에는 setTimeout에 의해서 console.log("대기")는 늦춰졌지만 여전히 코드는 흘러감.

sleep을 비슷하게 구현하기 위해서 우리는 ES2017 JavaScript에서 새롭게 추가된Promise를 사용한다.

const sleep = (time) => {
	return new Promise( () => setTimeout(console.log("대기"),time)
}
                       
async function runAsync () {
	console.log("시작")
	await sleep(3000)
	console.log("종료")
}
// 시작
// (3초뒤)
// 대기
// 종료
profile
준비하는 개발자

0개의 댓글