기본개념인데, JS는 약간의 말장난이 섞여있는 것 같아서 정리해보았다.
JS의 가장 큰 특장점은 비동기 논블록킹 언어라는 점이다.
- 타언어: 블로킹 + 동기 기반 언어
- JS : 블록킹 콜스택 + 비동기 논블록킹 이벤트루프큐 기반 언어
python requests 통신 예제
for i in range(100) :
request.get(url+i) # 한요청당 1초일 때 실행시간 100초
js 통신 예제
for (let i=0; i<100; i++)
fetch(url+i) // 한요청당 1초일 때 실행시간 1+@초
JS는 이벤트루프가 있어서 이미 논블록킹(실행 락 안검) 규현을 위한 큐가 있다.
하지만 python과같은 블록킹 기반 언어는 이벤트루프와 같은 개념이 없어서,
병렬처리를 위해 쓰레드를 만들든 async 키워드를 쓰든 큐를 생성해야함
즉, 타 언어에서 async는 "비동기 논블록킹"을 구현하기 위한 키워드이다.
하지만 js의 async 키워드는 사실 존재 자체가 필요가없다.
사전적 의미로도 "비동기"인 asynchronous인데, 비동기 기반 언어인데 왜 asynchronous 라는 키워드를 써야하나?
synchronous라는 키워드가 더 적절한게 아닌가?
JS는 내장 컨셉으로 이벤트큐가 있기때문에, async없이도 비동기큐를 표현할수있다.
JS는 async 키워드를 콜백을 편히 쓰기 위해 사용할 뿐이다.
이는 프로미스로 바꿔쓸 수도 있고, 프로미스는 또 콜백으로 표현할 수 있다.
JS를 쓰는사람 입장에서 async 키워드는 대기를 만드는 것 처럼 보여서, 동기식으로 만드는 것 처럼 보일 수 있는데
async 키워드는 사전적 의미로도, 타언어에서 먼저 등장한 원래 컨셉 자체로도 비동기를 구현하기 위해 등장한 키워드다.
다만 JS는 이벤트루프에 올라간 백그라운드에 올라간 코드 종료 이후에 다음 로직을 실행하도록 블록킹으로 제어하기 위해 동기식으로 바꾸는 것 처럼 보인다.