목차
- 코드의 동기적 실행과 비동기 개념
- blocking 현상
- 쓰레드
- 자바스크립트는 싱글쓰레드이다.
- 비동기적 코드
# 1. 코드의 동기적 실행과 비동기 개념
일반적으로, 프로그램 코드는 좌측 상단에서 부터 순차적으로 실행되며, 한번에 하나씩 실행된다. (코드의 동기적 실행)
만약 어떤 함수가 다른 함수의 결과에 의존하게 된다면, 그 함수는 다른 함수가 끝나고 결과가 반환될 때까지 기다려야 할 것이다.
또한 유저의 관점에서 그동안은 모든 프로그램 동작이 멈춘 것처럼 보일 것이다.
이러한 당황스러운 경험에 대한 대안으로 비동기 프로그래밍이라는 개념이 있다.
컴퓨터 사용에서, 비동기라는 단어는 두개의 주요 맥락에서 사용된다.
#1-1. Networking과 통신
비동기 통신은 메세지를 받은 후 즉시 처리가 아닌, 처리 가능한 시점에 처리하는 형태로, 둘 또는 그 이상의 당사자간 메세지를 교환하는 방식이다.
소프트웨어가 비동기적으로 통신할때, 프로그램은 서버와 같은 다른 소프트웨어에 정보를 요청할 수도 있으며, 응답을 기다리는 동안 다른 작업들을 계속할 수 있다.
예를 들어 AJAX 프로그래밍 기술은 HTTP를 사용하여서버에 비교적 적은 양의 데이터를 요청하며, 결과의 반환이 즉각적인 것이 아니라 가능한 시점에 반환되는 방법이다.
#1-2. 소프트웨어 디자인
비동기 소프트웨어 설계는 하나의 프로그램이 태스크가 완수될때까지 기다리지 않고 기존의 태스크와 별개로 수행되도록 하는 코드를 작성함으로써 그 개념을 확장한다. 별개로 수행되는 태스크가 완수된 경우, 기존의 태스크는 사전에 정한 알림 방법에 의해 작업이 완료되었으며, 필요하다면 그 작업의 결과를 이용할 수 있음을 알게 된다.
#2. 코드 blocking
코드의 비동기적 실행은 특히나 웹 프로그래밍에서 유용하다.
웹 어플리케이션이 다량의 코드를 한꺼번에 실행하는동안 브라우저에게 컨트롤을 돌려주지 않는다면, 유저의 입장에서는 브라우저가 멈춘 것처럼 보일 수도 있을 것이다.
이 멈춘 것처럼 보이는 상태를 blocking이라고 한다.
블록킹이란?
웹 어플리케이션이 유저의 요청을 처리하느라 브라우저에게 프로세스에 대한 컨트롤을 반환하지 않음으로써 브라우저가 멈춘 것처럼 보이는 현상.
#3. Threads(쓰레드)
쓰레드는 기본적으로 프로그램이 일을 완수하기 위해 사용하는 단일 프로세스이다.
각각의 쓰레드는 한번에 오직 하나의 일만 수행할 수 있다.
태스크 A --> 태스크 B --> 태스크 C
각각의 태스크들은 순차적으로 실행된다.
즉 하나의 태스크과 완료된 이후에 다음 차례의 태스크가 시작된다.
오늘날 많은 컴퓨터들이 멀티 코어를 가지고 있기 때문에, 한번에 여러 가지 일을 수행할 수 있다.
멀티 쓰레드를 지원하는 프로그래밍 언어들은 멀티 코어를 사용하여, 아래와 같이 여러 태스크들을 동시에 수행할 수 있다.
Thread 1 : Task A --> Task B
Thread 2 : Task C --> Task D
#4. 자바스크립트는 싱글 쓰레드이다
자바스크립트는 싱글 쓰레드이다.
멀티 코어를 가지고 있는 컴퓨터라 할 지라도 자바스크립트는 오직, main thread라고 불리는 단일의 쓰레드에서 작업을 실행한다.
단일쓰레드로 인해 발생한 blocking현상 등의 문제를 해결하기 위하여 자바스크립트는 몇 가지 툴을 도입하였다.
Web workers API는 처리해야 하는 몇몇 자바스크립트 태크스를 worker라고 불리는 분리된 쓰레드로 보내어, 동시에 다중의 자바스크립트 코드를 실행 가능하게 한다.
Main thread : TaskA --> Task B
Worker thread : Expensive TaskB
시간이 오래 걸리는 프로세스들을 워커 쓰레드가 실행함으로써 메인쓰레드는 블로킹되지 않을 것이다.
#5. 비동기적 코드(Asynchronous code)
5-1. Web worker의 한계
-DOM에 접근 불가능 > worker에게 UI 관련 지시 불가
-blocking은 발생하지 않지만 코드 실행이 동기적
5-2. 극복 방법 - 코드의 비동기적 실행
코드 실행이 동기적이라는 Web work의 한계는 코드 실행을 동기적으로 바꾸어주어 극복 가능하다.
이를 위해 사용되는 객체가 바로 Promise객체이다.
프로미스 객체에 대해서는 차후에 천천히 알아보도록 하자.
'JavaScript 이론 > 비동기프로그래밍(Asynchronous)' 카테고리의 다른 글
#2 비동기적인 자바스크립트 실행 (0) | 2022.03.07 |
---|
댓글