관리 메뉴

Bbaktaeho

[Javascript/Node.js] 비동기 프로그래밍 (자바스크립트, 비동기, 노드, nextTick) 본문

프로그래밍 (Programming)/자바스크립트 (JavaScript)

[Javascript/Node.js] 비동기 프로그래밍 (자바스크립트, 비동기, 노드, nextTick)

Bbaktaeho 2020. 5. 25. 03:03
반응형

📚 운영체제에서 비동기

  1. 일반적으로 파일 I/O나 네트워크 I/O는 메모리 I/O 보다 현저히 느림
  2. 파일 입출력에서 입출력을 하나씩 처리하면 처리 시간은 길어지고 CPU의 사용 효율성을 떨어짐
  3. 비동기 프로그래밍은 순차적으로 I/O 을 처리하는 것이 아니라 I/O 처리 요청만 운영체제에 전달하고 CPU는 다른 연산을 수행함
  4. I/O 처리가 완료되면 완료했다는 메시지를 받아 이후 작업을 처리함
  5. 비동기 프로그래밍은 I/O 처리 요청 순서와 별개로 처리를 완료하는 순서는 제각각임
  6. 개발자는 보장되지 않는 I/O 완료 처리를 고려해 프로그래밍해야 함

📚 Node.js 에서 비동기

  • node.js 에서 모든 함수와 모듈이 비동기 프로그래밍을 기본으로 함 (동기 방식 함수도 존재하지만 제한적)
  • node.js 내부의 스레드 풀을 활용하여 다른 스레드로 함수를 전달해 일을 시킬 수 있음

📗 nextTick

특정 함수를 호출하기 전 CPU가 다른 높은 우선순위의 명령을 수행

  • process.nextTick(callback, 콜백 함수 인자)

  • 비동기 동작을 가능하게 해 줌

  • 콜백 함수 다뤄보기

    겉보기에는 비동기 프로그래밍처럼 보이지만 같은 스레드에서 동기적으로 동작함

function test(callback) {
    callback(2);
}

function sqrtCB(num) {
    console.log(Math.sqrt(num));
}

test(sqrtCB);
1.4142135623730951
  • 비동기적 콜백

    nextTick 함수를 사용하여 비동기적으로 콜백

function test(callback) {
    process.nextTick(callback, 3); // 인자로 받은 콜백을 nextTick 함수의 인자로 전달해줌
}

function sqrtCB(num) {
    console.log(Math.sqrt(num));
}

test(sqrtCB);
1.7320508075688772
  • 비동기적 콜백에서 예외 발생

    위의 코드로는 비동기 프로그래밍처럼 보이지 않기 때문에 일부러 예외를 발생시켜보자

function test(callback) {
    process.nextTick(callback); // 인자로 받은 콜백을 nextTick 함수의 인자로 전달해줌
}

function sqrtCB(num) {
    if (typeof num != 'number') throw Error('예외 발생!');
    console.log(Math.sqrt(num));
}

test(sqrtCB);
if (typeof num != 'number') throw Error('예외 발생!');
                                ^

Error: 예외 발생!
    at sqrtCB (D:\workspace\vscode\blog\code.js:6:39)
    at processTicksAndRejections (internal/process/task_qu
eues.js:79:11)

task_queue에서 rejection 된 것을 알 수 있음

  • 비동기적 콜백에서 예외 처리

    try catch 문법을 활용하여 예외를 처리해보자

    (try catch 문법으로 예외 처리하게 된다면 발생한 예외로 인해 종료되는 것을 막고 개발자가 예외를 처리할 수 있도록 해준다)

function test(callback) {
    process.nextTick(callback); // 인자로 받은 콜백을 nextTick 함수의 인자로 전달해줌
}

function sqrtCB(num) {
    if (typeof num != 'number') throw Error('예외 발생!');
    console.log(Math.sqrt(num));
}

try {
    test(sqrtCB);
} catch (err) {
    console.error(err);
}
if (typeof num != 'number') throw Error('예외 발생!');
                                ^

Error: 예외 발생!
    at sqrtCB (D:\workspace\vscode\blog\code.js:6:39)
    at processTicksAndRejections (internal/process/task_qu
eues.js:79:11)

예외처리를 했지만 예외 처리를 하지 않은 코드와 달라진 것이 없다. 예외처리가 되지 않고 프로세스 실행 에러가 발생한 이유는 nextTick 함수 때문에 그렇다. nextTick 함수는 비동기 처리를 위해 Node.js 내부 스레드 풀로 다른 스레드 위에서 인자로 받은 콜백 함수를 동작시킨다. 반면 try catch 문법은 같은 스레드 위에서만 동작하기 때문에 다른 스레드에서 발생한 예외를 처리하지 못한다.


반응형