Node.js 다중 프로세스


Node.js는 단일 스레드 모드에서 실행된다는 것을 모두 알고 있지만 Node.js는 이벤트 기반을 사용하여 동시성을 처리하므로 멀티 코어 CPU 시스템에서 여러 하위 프로세스를 생성하여 성능을 향상시키는 데 도움이 됩니다.

각 하위 프로세스에는 항상 child.stdin, child.stdout 및 child.stderr의 세 가지 스트림 개체가 있습니다. 이들은 상위 프로세스의 stdio 스트림을 공유할 수도 있고 독립적으로 리디렉션된 스트림 객체일 수도 있습니다.

Node는 하위 프로세스를 생성하기 위해 child_process 모듈을 제공합니다. 메서드는 다음과 같습니다.

  • exec - child_process.exec는 하위 프로세스를 사용하여 명령을 실행하고 하위 프로세스의 출력을 캐시합니다. 콜백 함수 매개변수 형태의 하위 프로세스입니다.

  • spawn - child_process.spawn은 지정된 명령줄 인수를 사용하여 새 프로세스를 생성합니다.

  • fork - child_process.fork는spawn('node', [' ./son.js']) . 생성 방법과 달리 포크는 프로세스 간 통신을 위해 상위 프로세스와 하위 프로세스 간의 통신 채널을 설정합니다.


exec() 메서드

child_process.exec는 하위 프로세스를 사용하여 명령을 실행하고, 하위 프로세스의 출력을 캐시하고, 하위 프로세스의 출력을 콜백 함수 매개 변수 형식으로 반환합니다.

구문은 다음과 같습니다.

child_process.exec(command[, options], callback)

Parameters

매개변수 설명은 다음과 같습니다.

명령: 문자열, 실행할 명령, 매개변수는 공백으로 구분됩니다.

옵션: 개체, 가능 :

  • cwd , 문자열, 자식 프로세스의 현재 작업 디렉터리

  • env, 객체 환경 변수 키-값 쌍

  • encoding , 문자열, 문자 인코딩 (기본값: 'utf8')

  • shell , string , 명령을 실행할 쉘 (기본값: UNIX의 경우 /bin/sh, 在 Windows 中为cmd.exe, Shell 应当能识别 -c开关在 UNIX 中,或 /s /c 在 Windows 中。 在Windows 中,命令行解析应当能兼容cmd.exe)

  • timeout, number, timeout (기본값: 0)

  • maxBuffer, number, stdout에 존재할 수 있는 최대 버퍼 또는 stderr(바이너리), 초과하면 하위 프로세스가 종료됩니다(기본값: 200*1024)

  • killSignal, 문자열, 종료 신호(기본값: 'SIGTERM')

  • uid, 숫자, ID 설정 사용자 프로세스의

  • gid, 번호, 프로세스 그룹의 ID 설정

callback: Callback 함수에는 오류, stdout 및 stderr의 세 가지 매개변수가 포함되어 있습니다.

exec() 메소드는 가장 큰 버퍼를 반환하고 프로세스가 끝날 때까지 기다린 후 버퍼의 내용을 한 번에 반환합니다.

support.js와 master.js라는 두 개의 js 파일을 만들어 보겠습니다.

support.js 파일 코드:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js 파일 코드:

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,
      function (error, stdout, stderr) {
         if (error) {
            console.log(error.stack);
            console.log('Error code: '+error.code);
            console.log('Signal received: '+error.signal);
         }
         console.log('stdout: ' + stdout);
         console.log('stderr: ' + stderr);
      });

      workerProcess.on('exit', function (code) {
      console.log('子进程已退出,退出码 '+code);
   });
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ node master.js 
子进程已退出,退出码 0
stdout: 进程 1 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 0 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 2 执行。

stderr:

spawn() 메서드

child_process.spawn은 지정된 명령줄 매개변수를 사용하여 새 프로세스를 생성합니다. 구문 형식은 다음과 같습니다.

child_process.spawn(command[, args][, options])

매개변수

매개변수 설명은 다음과 같습니다.

명령: 실행할 명령

args : 배열 문자열 매개변수 array

options Object

  • cwd 문자열 하위 프로세스의 현재 작업 디렉터리

  • env 개체 환경 변수 키-값 쌍

  • stdio Array|하위 프로세스의 문자열 stdio 구성

  • detached Boolean 이 하위 프로세스가 프로세스 그룹의 리더가 됩니다

  • uid Number 사용자 프로세스의 ID를 설정합니다

  • gid Number Set 프로세스 그룹의 ID

spawn() 메서드는 프로세스가 대량의 데이터를 반환할 때 사용되는 스트림(stdout 및 stderr)을 반환합니다. generate()는 프로세스가 실행되기 시작하자마자 응답을 받기 시작합니다.

support.js와 master.js라는 두 개의 js 파일을 만들어 보겠습니다.

support.js 파일 코드:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js 파일 코드:

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('子进程已退出,退出码 '+code);
   });
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ node master.js stdout: 进程 0 执行。

子进程已退出,退出码 0
stdout: 进程 1 执行。

子进程已退出,退出码 0
stdout: 进程 2 执行。

子进程已退出,退出码 0

fork 메서드

child_process.fork는spawn() 메서드의 특수한 형식입니다. , 프로세스 생성에 사용되며 구문 형식은 다음과 같습니다.

child_process.fork(modulePath[, args][, options])

매개변수

매개변수 설명은 다음과 같습니다.

modulePath: 문자열, 하위 프로세스에서 실행될 모듈

args: 배열 문자열 매개변수 array

options: Object

  • cwd 문자열 하위 프로세스의 현재 작업 디렉터리

  • env 개체 환경 변수 키-값 쌍

  • execPath 문자열 하위 프로세스의 실행 파일 생성

  • execArgv Array 자식 프로세스의 실행 파일 문자열 매개변수 배열 (기본값: process.execArgv)

  • silent Boolean if true,子进程的stdinstdoutstderr将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false)

  • uid Number 사용자 프로세스의 ID 설정

  • gid Number 프로세스 그룹의 ID 설정

반환된 객체 ChildProcess 인스턴스의 모든 메소드를 갖는 것 외에도 내장된 통신 채널도 있습니다.

h3>예제

support.js와 master.js라는 두 개의 js 파일을 만들어 보겠습니다.

support.js 파일 코드:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js 파일 코드:

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('子进程已退出,退出码 ' + code);
   });
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ node master.js 
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0