1. 동기? 비동기?

동기(synchronous)작업은 작업이 순차적으로 이뤄지는 일괄작업을 의미하고 비동기(asynchonous)작업은 작업이 현재 상태와 관계없이 이뤄진다. 커피숍을 예시로 들면 커피를 한명씩 순서대로 대기하여 받아가면 동기 작업이고 진동벨을 통해 비 순차적으로 받아가면 비동기 작업이다.

2. 블로킹, 논 블로킹

동기작업은 하나의 작업을 수행하면 다른 작업은 수행되지 않고 대기한다. 이를 블로킹(blocking)이라 한다. 반면 비동기 작업은 현 상태와 관계없으므로 작업들이 병렬적으로 수행된다. 이를 (non blocking)이라고 한다.

3. Js에서의 비동기

알 사람들은 알고 있듯이 js는 브라우저나 node v8에서 기본적으로 싱글스레드언어이다. 싱글스레드는 기본적으로 별도의 스레드에 임무을 할당할 수 없으므로 비동기 작업을 독특한 방식으로 실행한다. 그 첫번째가 web worker 이다.

4. Web worker

웹 워커(web worker)는 브라우저에서는 새로운 스레드를 생성하여 논 블로킹작업을 수행하고 node에선 worker thread를 생성하여 비동기 작업을 수행한다.

const worker = new Worker('worker_file.js')
worker.onmessage = (e) => { ... }
worker.terminate()

/* worker_file.js */
const some_data_object = some_work()
postMessage(some_data_object)

브라우저에선 worker를 생성하고 onmessage 를 통해서 worker가 보낸 데이터를 받는다. worker는 작업을 수행하고 postMessage 를 통해 데이터를 보낸다. 작업이 마무리된 worker는 종료(terminate) 시켜야 한다.

Worker는 상당히 효율적인 방식이지만 근본적인 2가지 문제가 존재한다. 하나는 Dom에 접근하지 못하는 점이고 하나는 메인 프로세스에서 결과를 받아서 진행하는것이 어렵다는 점이다. 따라서 새로운 접근법이 요구되었고 그게 asynchronous code이다

5. Asynchronous code