멀티프로세스에 대한 지식이 많고, 프로세스 모듈을 작성할 때도 언급한 내용인데, 이해하기는 그리 어렵지 않다는 것을 알았습니다. 이번 글에서는 node.js를 이용하여 자식 프로세스를 생성하는 방법에 대한 관련 정보를 주로 소개하고 있으니, 필요한 친구들이 참고하면 도움이 될 것 같습니다.
머리말
Node 자체는 단일 프로세스이며 동시성을 처리하기 위해 드라이버 모드를 사용합니다. 멀티 코어 CPU에서 단일 프로세스의 리소스 낭비를 해결하기 위해 노드는 클러스터 및 child_process 모듈을 제공합니다. 여러 하위 프로세스를 만듭니다.
Node.js는 단일 스레드이므로 다중 프로세서 시스템에서는 낭비됩니다. 어떻게 사용할 수 있나요? 그래서 child_process 모듈이 나타났습니다. child_process 모듈은 다른 프로세스에 대한 작업을 생성, 분기 및 수행할 수 있습니다.
child_process 모듈은 상위 프로세스에서 하위 프로세스에 액세스하는 표현으로 사용할 수 있는 새로운 클래스 ChildProcess를 제공합니다. Process 모듈은 ChildProcess 개체이기도 합니다. 상위 모듈에서 프로세스에 액세스하면 이는 상위 ChildProcess 개체입니다. 하위 프로세스에서 Process에 액세스하면 이는 ChildProcess 개체입니다. 개체를 이해하는 것은 이벤트, 메서드 및 속성에 지나지 않습니다. ChildProcess도 마찬가지입니다.
각 하위 프로세스에는 항상 child.stdin, child.stdout, child.stderr의 세 가지 스트림 개체가 있습니다. 그들은 상위 프로세스의 stdio 스트림을 공유할 수 있습니다.
여기에서는 먼저 child_process 모듈에서 exec,spawn,fork의 세 가지 방법을 사용하여 하위 프로세스를 작동하는 방법을 소개합니다.
node-childProcess 파일을 생성하고 그 안에 node-childPro.js 파일을 생성하세요.
한 줄의 코드는 다음과 같습니다:
console.log("进程 " + process.argv[2] + " 执行。" ); //换成下面的查看process.argv //console.log("进程 " + process.argv + " 执行。" );
exec() methodnode-childProcess 파일에 다음과 같이 새 node-childPro-exec.js 파일을 만듭니다.
const fs = require('fs'); const child_process = require('child_process'); for (var i = 0; i < 3; i++) { //这里有空格请注意。分别代表node路径 node-childPro.js路径 i第几个进程。 node-childPro.js中的process.argv可以获取这些信息值 var childProcess = child_process.exec('node node-childPro.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); }); childProcess.on('exit', function (code) { console.log('子进程已退出,退出码 ' + code); }); }
터미널 실행 코드의 결과는 다음과 같습니다.
G:\node\node-childProcess> node node-childPro-exec.js 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr:
spawn() 메소드새 node-child 생성 프로- node-childProcess 파일의 generate.js에서 코드는 다음과 같습니다.
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var childProcess = child_process.spawn('node', ['node-childPro-spawn.js', i]); childProcess.stdout.on('data', function (data) { console.log('stdout: ' + data); }); childProcess.stderr.on('data', function (data) { console.log('stderr: ' + data); }); childProcess.on('close', function (code) { console.log('子进程已退出,退出码 '+code); }); }
터미널에서 코드를 실행한 결과는 다음과 같습니다.
G:\node\node-childProcess> node node-childPro-spawn.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 stdout: 进程 2 执行。 子进程已退出,退出码 0 子进程已退出,退出码 0
fork() 메소드node-childProcess 파일 Pro-fork.js에 새로운 node-child를 생성합니다. 코드는 다음과 같습니다.
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var childProcess = child_process.fork("node-childPro.js", [i]); childProcess.on('close', function (code) { console.log('子进程已退出,退出码 ' + code); }); }
터미널 실행 코드 결과는 다음과 같습니다.
G:\node\node-childProcess> node node-childPro-fork.js 进程 0 执行。 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0 子进程已退出,退出码 0
exec,spawn,fork에 대하여 1. exec 함수는 일종의spawn Friendly encapsulation으로 Shell 명령어 파싱을 추가하여 복잡한 명령어를 직접 삽입할 수 있습니다
2. exec 함수는 하위 프로세스의 출력을 캐시하고 콜백 함수 매개변수의 형태로 하위 프로세스의 출력을 반환합니다
3. 자식 스레드에서 생성이 시작됩니다. 실행 후 자식 스레드에서 지속적으로 데이터를 반환하기 시작합니다. 프로세스를 메인 프로세스로("시스템 모니터링"과 같은 응용 시나리오) 4.spawn은 콜백 기능을 지원하지 않습니다. 스트림을 통해 메인 프로세스로 데이터를 전송하므로 여러 프로세스 간 데이터 교환이 가능합니다.
5. 포크( )는 노드 프로세스를 파생시키는 데 사용되는spawn()의 특별한 경우입니다. 일반 ChildProcess 인스턴스의 모든 메서드 외에도 반환된 개체에는 내장 통신 채널도 있습니다.
아직 배우셨나요? 서둘러서 한번 시도해 보세요.
PHP 및 Node.js
Node.js - 비동기 흐름 제어에 대한 간략한 소개
위 내용은 node.js를 사용하여 하위 프로세스를 만드는 방법을 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!