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
,子进程的stdin
,stdout
和stderr
将会被关联至父进程,否则,它们将会从父进程中继承。(默认为: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