노드에는 여러 스레드가 있지만 V8에서 실행되는 JavaScript는 단일 스레드입니다. Node의 child_process 모듈은 하위 프로세스를 만드는 데 사용되며 아동 프로세스를 통해 CPU를 최대한 활용할 수 있습니다. 예:
코드 사본은 다음과 같습니다.
var fork = 요구 ( 'child_process'). 포크;
// 현재 컴퓨터의 CPU 번호를 얻습니다
var cpus = require ( 'os'). cpus ();
for (var i = 0; i <cpus.length; i ++) {
// 새로운 프로세스를 생성합니다
포크 ( './ worker.js');
}
다음은 포크를 포함한 프로세스를 만드는 몇 가지 방법입니다.
1.spawn (command, [args], [옵션]), 명령을 실행하기 위해 새로운 프로세스를 시작하고, Args는 명령 줄 매개 변수입니다.
2.Exec (명령, [옵션], 콜백), 명령 명령을 실행하기 위해 새 프로세스를 시작하고, 콜백은 프로세스 끝에서 표준 입력, 표준 출력 및 오류 정보를 얻는 데 사용됩니다.
3. Execfile (파일, [Args], [옵션], [Callback])는 실행 파일을 실행하기 위해 새로운 프로세스를 시작합니다. 콜백은 프로세스 끝에서 표준 입력, 표준 출력 및 오류 정보를 얻는 데 사용됩니다.
4. fork (modulepath, [args], [옵션]), JavaScript 파일 모듈을 실행하는 새로운 프로세스를 시작하면 현재 노드 하위 프로세스가 생성됩니다.
노드 간간 통신
부모 과정
코드 사본은 다음과 같습니다.
// parent.js
var fork = 요구 ( 'child_process'). 포크;
// 포크는 자식 프로세스 객체를 반환합니다. n
var n = 포크 ( './ child.js');
// 이벤트 메시지를 처리합니다
n.on ( 'message', function (m) {
// 아동 프로세스가 보낸 메시지를받습니다
console.log ( 'got message :' + m);
});
// 아동 프로세스에 메시지를 보냅니다
n.send ({hello : 'world'});
하위 프로세스
코드 사본은 다음과 같습니다.
// child.js
// 이벤트 메시지를 처리합니다
process.on ( '메시지', function (m) {
console.log ( 'got message :' + m);
});
// 보내기 메소드는 상위 프로세스에 메시지를 전송하기위한 존재합니다.
process.send ({foo : 'bar'});
여기서 보내기 메소드는 동기식이므로 많은 양의 데이터를 보내는 것이 권장되지 않습니다 (대신 파이프를 사용할 수 있습니다. http://nodejs.org/api/all#child_process_child_process_spawn_command_args_options를 참조하십시오).
특별한 경우, 메시지의 CMD 속성 값에는 node_ prefix (예 : {cmd : 'node_foo'} 메시지)가 포함되어 있으면이 메시지가 메시지 이벤트에 제출되지 않지만 (내부 관리 이벤트), 노드에서 내부적으로 사용됩니다.
보내기 방법의 프로토 타입은 다음과 같습니다.
코드 사본은 다음과 같습니다.
보내기 (메시지, [sendhandle])
여기서 SendHandle (핸들)을 사용하여 다음을 보낼 수 있습니다.
1.net.native, 기본 C ++ TCP 소켓 또는 파이프 라인
2.net.server, TCP 서버
3.net.socket, TCP 소켓
4.DGRAM.NATIVE, 기본 C ++ UDP 소켓
5.dgram.socket, UDP 소켓
SendHandle을 보낼 때 보낼 때 JavaScript 객체를 직접 보내는 것은 아니지만 파일 디스크립터 (결국 JSON 문자열로 전송)를 보내는 것이 아닙니다. 다른 프로세스는이 파일 디스크립터를 통해 해당 객체를 복원 할 수 있습니다.
이제 예를보십시오.
부모 과정
코드 사본은 다음과 같습니다.
// parent.js
var fork = 요구 ( 'child_process'). 포크;
var n = 포크 ( './ child.js');
var server = require ( 'net'). createServer ();
server.listen (7000, function () {
// TCP 서버를 자식 프로세스로 전송합니다
N.Send ( 'Server', Server);
}). on ( 'Connection', function () {
Console.log ( 'Connection -Parent');
});
하위 프로세스
코드 사본은 다음과 같습니다.
process.on ( '메시지', 함수 (m, h) {
if (m === 'server') {
h.on ( '연결', function () {
Console.log ( 'Connection -child');
});
}
});
포트 7000을 통해이 프로그램에 액세스하면 연결부 또는 연결 자식으로 출력 될 수 있습니다. 여기서, 아동 프로세스와 부모 절차는 동시에 포트 7000을 듣습니다. 일반적으로 말하면, 동일한 포트를 듣는 여러 프로세스로 인해 Eaddrinuse 예외가 발생합니다. 이 경우 두 개의 다른 프로세스는 동일한 파일 디스크립터를 사용하고 노드 기본 레이어는 포트를들을 때 소켓에서 SO_Reuseaddr 옵션을 설정 하여이 소켓이 다른 프로세스간에 재사용 할 수 있습니다. 여러 프로세스가 동일한 포트를 듣는 경우 파일 디스크립터는 동시에 한 프로세스로만 사용할 수 있으며 이러한 프로세스는 소켓을 선제 적으로 사용합니다.
클러스터 모듈
새로운 클러스터 모듈이 노드에서 v0.8에 추가되었으며,이를 통해 클러스터 모듈은 물리적 시스템에서 동일한 포트를 듣는 프로세스 그룹을 쉽게 빌드 할 수 있습니다. 예:
코드 사본은 다음과 같습니다.
var cluster = require ( 'cluster');
var http = 요구 ( 'http');
var numcpus = require ( 'os'). cpus (). 길이;
// 프로세스가 마스터 프로세스인지 확인하십시오
if (cluster.ismaster) {
for (var i = 0; i <numcpus; ++ i)
// 새 작업자 프로세스 생성 (마스터 프로세스 만 호출 할 수 있음)
cluster.fork ();
cluster.on ( '종료', 함수 (작업자, 코드, 신호) {
Console.log ( 'Worker' + worker.process.pid + 'die');
});
} 또 다른 {
http.createserver (function (req, res) {
res.writehead (200);
res.end ( 'Hello World/n');
}). 듣기 (8000);
}
우리는 작업자 프로세스에서 청취 방법을 호출하며 청취 요청은 마스터 프로세스로 전달됩니다. 마스터 프로세스에 이미 작업자 프로세스의 요구 사항을 충족시키기 위해 서버가 듣고있는 경우이 서버의 핸들이 작업자에게 전달됩니다. 존재하지 않으면 마스터 프로세스는 하나를 생성 한 다음 핸들을 작업자 프로세스로 전달합니다.
클러스터에 대한 자세한 내용은 http://www.nodejs.org/api/cluster.html