HOWTO · Node.js

Node.js의 멀티스레딩

이 가이드에서는 Node.js의 멀티스레딩에 대해 알아봅니다.

이 페이지의 내용

Node.js에서 “멀티스레딩"이라는 용어는 Node.js가 단일 스레드 이벤트 루프에서 실행되도록 설계되었기 때문에 적용되지 않습니다. 그러나 Node.js는 기본적으로 단일 스레드인 JavaScript 언어 위에 구축됩니다.

그러나 Node.js는 동시 프로그래밍 작업을 수행하는 몇 가지 방법을 제공합니다. 이를 수행하는 한 가지 방법은 메인 Node.js 프로세스와 동시에 실행할 수 있는 새 프로세스를 생성할 수 있는 child_process 모듈을 사용하는 것입니다.

Node.js에서 동시 작업을 수행하는 또 다른 방법은 async/await 구문을 사용하는 것입니다. 이를 통해 동기식처럼 보이는 비동기 코드를 작성할 수 있습니다. 이렇게 하면 새 프로세스를 명시적으로 생성하거나 콜백을 사용하지 않고도 여러 작업을 동시에 수행하는 코드를 더 쉽게 작성할 수 있습니다.

예를 들어 다음 코드는 async/await를 사용하여 두 작업을 동시에 수행합니다.

async function runTasks() {
  const task1 = doTask1();
  const task2 = doTask2();

  await Promise.all([task1, task2]);
}

이 예에서 doTask1doTask2약속을 반환하는 비동기 함수입니다. 대기 연산자는 계속하기 전에 두 약속이 해결될 때까지 기다리는 데 사용됩니다.

이렇게 하면 두 작업을 순차적이 아닌 동시에 수행할 수 있습니다. async/await 구문은 JavaScript Promise 유형 위에 구축되어 있어 기존 동기 코드와 유사한 방식으로 비동기 코드를 작성할 수 있습니다.

Node.js의 child_process 모듈은 새 프로세스를 생성하는 쉬운 방법을 제공합니다. Node.js 프로그램 내에서 Bash 스크립트 또는 기타 실행 파일과 같은 외부 프로그램을 실행할 수 있습니다.

Node.js에서 멀티스레딩 구현

다음은 child_process 모듈을 사용하여 Bash 스크립트를 실행하는 예입니다.

이 예에서 exec 함수는 bash_script.sh라는 Bash 스크립트를 실행하는 데 사용됩니다. 이 함수는 프로세스가 완료될 때 호출되는 콜백을 받습니다.

콜백은 error, stdoutstderr의 세 가지 인수를 받습니다. 이러한 인수에는 발생한 오류, 프로세스의 표준 출력 및 프로세스의 표준 오류가 각각 포함됩니다.

child_process 모듈은 spawn, forkexecFile과 같은 프로세스 생성을 위한 몇 가지 다른 기능을 제공합니다. 이러한 각 기능에는 고유한 옵션 및 동작 세트가 있으므로 필요에 가장 적합한 기능을 선택할 수 있습니다.

const {exec} = require('child_process');

exec('bash_script.sh', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`Script run successfully`);
});

출력:

stdout:
stderr:
Script run successfully