Node.js의 멀티스레딩

Waqar Aslam 2023년10월12일
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
작가: Waqar Aslam
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn