동기(synchronous)작업은 작업이 순차적으로 이뤄지는 일괄작업을 의미하고 비동기(asynchonous)작업은 작업이 현재 상태와 관계없이 이뤄진다. 커피숍을 예시로 들면 커피를 한명씩 순서대로 대기하여 받아가면 동기 작업이고 진동벨을 통해 비 순차적으로 받아가면 비동기 작업이다.
동기작업은 하나의 작업을 수행하면 다른 작업은 수행되지 않고 대기한다. 이를 블로킹(blocking)이라 한다. 반면 비동기 작업은 현 상태와 관계없으므로 작업들이 병렬적으로 수행된다. 이를 (non blocking)이라고 한다.
알 사람들은 알고 있듯이 js는 브라우저나 node v8에서 기본적으로 싱글스레드언어이다. 싱글스레드는 기본적으로 별도의 스레드에 임무을 할당할 수 없으므로 비동기 작업을 독특한 방식으로 실행한다. 그 첫번째가 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이다