Node.js-확장 애플리케이션

Node.js는 단일 스레드 모드에서 실행되지만 이벤트 기반 패러다임을 사용하여 동시성을 처리합니다. 또한 다중 코어 CPU 기반 시스템에서 병렬 처리를 활용하기 위해 자식 프로세스를 쉽게 만들 수 있습니다.

자식 프로세스에는 항상 세 개의 스트림이 있습니다. child.stdin, child.stdout, 및 child.stderr 부모 프로세스의 stdio 스트림과 공유 될 수 있습니다.

노드 제공 child_process 하위 프로세스를 만드는 다음 세 가지 주요 방법이있는 모듈입니다.

  • exec − child_process.exec 메소드는 쉘 / 콘솔에서 명령을 실행하고 출력을 버퍼링합니다.

  • spawn − child_process.spawn은 주어진 명령으로 새 프로세스를 시작합니다.

  • fork − child_process.fork 메소드는 자식 프로세스를 생성하기위한 spawn ()의 특별한 경우입니다.

exec () 메서드

child_process.exec 메서드는 셸에서 명령을 실행하고 출력을 버퍼링합니다. 다음과 같은 서명이 있습니다.

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

매개 변수

다음은 사용 된 매개 변수에 대한 설명입니다.

  • command (String) 공백으로 구분 된 인수를 사용하여 실행할 명령입니다.

  • options (Object)는 다음 옵션 중 하나 이상을 포함 할 수 있습니다.

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

    • env (Object) 환경 키-값 쌍

    • encoding (문자열) (기본값 : 'utf8')

    • shell (문자열) 명령을 실행할 셸 (기본값 : UNIX의 경우 '/ bin / sh', Windows의 경우 'cmd.exe', 셸은 UNIX의 경우 -c 스위치, Windows의 경우 / s / c를 이해해야합니다. Windows의 경우, 명령 줄 구문 분석은 cmd.exe와 호환되어야합니다.)

    • timeout (숫자) (기본값 : 0)

    • maxBuffer (숫자) (기본값 : 200 * 1024)

    • killSignal (문자열) (기본값 : 'SIGTERM')

    • uid (번호) 프로세스의 사용자 ID를 설정합니다.

    • gid (번호) 프로세스의 그룹 ID를 설정합니다.

  • callback 이 함수는 세 개의 인수를 얻습니다. error, stdout,stderr 프로세스가 종료 될 때 출력과 함께 호출됩니다.

exec () 메서드는 최대 크기의 버퍼를 반환하고 프로세스가 끝날 때까지 기다렸다가 버퍼링 된 모든 데이터를 한 번에 반환하려고합니다.

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

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: 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('Child process exited with exit code '+code);
   });
}

이제 master.js를 실행하여 결과를 확인하십시오.

$ node master.js

출력을 확인하십시오. 서버가 시작되었습니다.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

spawn () 메서드

child_process.spawn 메서드는 주어진 명령으로 새 프로세스를 시작합니다. 다음과 같은 서명이 있습니다.

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

매개 변수

다음은 사용 된 매개 변수에 대한 설명입니다.

  • command (문자열) 실행할 명령

  • args (배열) 문자열 인수 목록

  • options (Object)는 다음 옵션 중 하나 이상을 포함 할 수 있습니다.

    • cwd (문자열) 자식 프로세스의 현재 작업 디렉터리입니다.

    • env (Object) 환경 키-값 쌍입니다.

    • stdio (배열) String Child의 stdio 구성.

    • customFds (배열) stdio에 사용할 자식에 대한 더 이상 사용되지 않는 파일 설명자입니다.

    • detached (부울) 하위가 프로세스 그룹 리더가됩니다.

    • uid (번호) 프로세스의 사용자 ID를 설정합니다.

    • gid (번호) 프로세스의 그룹 ID를 설정합니다.

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

support.js 및 master.js라는 두 개의 js 파일을 만듭니다.

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: 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('child process exited with code ' + code);
   });
}

이제 master.js를 실행하여 결과를 확인하십시오.

$ node master.js

출력을 확인하십시오. 서버가 시작되었습니다

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

fork () 메서드

child_process.fork 메소드는 Node 프로세스를 생성하기위한 spawn ()의 특별한 경우입니다. 다음과 같은 서명이 있습니다.

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

매개 변수

다음은 사용 된 매개 변수에 대한 설명입니다.

  • modulePath (문자열) 자식에서 실행할 모듈입니다.

  • args (배열) 문자열 인수 목록

  • options (Object)는 다음 옵션 중 하나 이상을 포함 할 수 있습니다.

    • cwd (문자열) 자식 프로세스의 현재 작업 디렉터리입니다.

    • env (Object) 환경 키-값 쌍입니다.

    • execPath (String) 자식 프로세스를 만드는 데 사용되는 실행 파일입니다.

    • execArgv (배열) 실행 파일에 전달 된 문자열 인수 목록 (기본값 : process.execArgv).

    • silent (Boolean) true 인 경우 자식의 stdin, stdout 및 stderr가 부모에게 파이프되고 그렇지 않으면 부모로부터 상속됩니다. 자세한 내용은 spawn ()의 stdio에 대한 "pipe"및 "inherit"옵션을 참조하십시오. 세부 정보 (기본값은 false).

    • uid (번호) 프로세스의 사용자 ID를 설정합니다.

    • gid (번호) 프로세스의 그룹 ID를 설정합니다.

fork 메서드는 일반 ChildProcess 인스턴스에 모든 메서드를 포함하는 것 외에도 기본 제공 통신 채널이있는 개체를 반환합니다.

support.js 및 master.js라는 두 개의 js 파일을 만듭니다.

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: 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('child process exited with code ' + code);
   });
}

이제 master.js를 실행하여 결과를 확인하십시오.

$ node master.js

출력을 확인하십시오. 서버가 시작되었습니다.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0