Node.js 의 프로 세 스 관 리 를 깊이 이해 합 니 다.

머리말
본 고 는 주로 Node.js 에서 프로 세 스 관리 와 관련 된 것 에 대해 간단 한 소 개 를 하고 자 합 니 다.프로 세 스 대상,child_공정 모듈cluster 모듈를 포함 하고 상세 한 API 는 공식 문 서 를 볼 수 있 습 니 다.다음은 상세 한 소 개 를 살 펴 보 겠 습 니 다.
프로 세 스 대상
process 는 Node.js 의 전역 대상 으로 require 명령 없 이 어디서 든 직접 사용 할 수 있 습 니 다.프로 세 스 대상 은 현재 node 프로 세 스 의 명령 행 인자,표준 입 출력,실행 환경 과 실행 상태 등 정 보 를 제공 합 니 다.
상용 속성
argvprocess.argv속성 은 하나의 배열 을 되 돌려 줍 니 다.첫 번 째 요 소 는 node 이 고 두 번 째 요 소 는 스 크 립 트 파일 이름 이 며 나머지 구성원 은 스 크 립 트 파일 의 인자 입 니 다.

$ node process-2.js one two=three four

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four
env
process.env 는 현재 Shell 의 모든 환경 변 수 를 포함 하 는 대상 을 되 돌려 줍 니 다.예 를 들 어:

{
 TERM: 'xterm-256color',
 SHELL: '/bin/zsh',
 USER: 'huangtengfei',
 PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
 PWD: '/Users/huangtengfei',
 HOME: '/Users/huangtengfei'
}
이 속성의 일반적인 사용 장면 은,새로운 NODE 입 니 다.ENV 변 수 는 현재 처 한 개발 단 계 를 확인 하 는 데 사용 되 며,생 성 단 계 는 production 으로 설정 하고,개발 단 계 는 develop 으로 설정 한 다음 스 크 립 트 에서 읽 기process.env.NODE_ENV 한 다음 에 해당 하 는 처 리 를 하면 됩 니 다.
스 크 립 트 를 실행 할 때 환경 변 수 를 이렇게 변경 할 수 있 습 니 다:

$ export NODE_ENV=production && node app.js
#   
$ NODE_ENV=production node app.js
stdin/stdoutprocess.stdin표준 입력(키보드 가 버퍼 에 있 는 것)을 가리 키 며 읽 을 수 있 는 흐름 을 되 돌려 줍 니 다.

process.stdin.setEncoding('utf8');

process.stdin.on('readable', () => {
 var chunk = process.stdin.read();
 if (chunk !== null) {
 process.stdout.write(`data: ${chunk}`);
 }
});

process.stdin.on('end', () => {
 process.stdout.write('end');
});
process.stdout 은 표준 출력(사용자 에 게 내용 표시)을 가리 키 며 쓸 수 있 는 흐름 을 되 돌려 줍 니 다.

const fs = require('fs');

fs.createReadStream('wow.txt')
 .pipe(process.stdout);
상용 방법
cwd()process.cwd() 노드 를 실행 하 는 작업 디 렉 터 리(절대 경로)를 되 돌려 줍 니 다.예 를 들 어 디 렉 터 리/Users/huangtengfei/abc 에서 node server.js 를 실행 하면process.cwd() 되 돌아 오 는 것 은/Users/huangtengfei/abc 입 니 다.
또 다른 상용 경 로 를 얻 는 방법 은dirname,파일 을 실행 할 때 이 파일 이 파일 시스템 에 있 는 디 렉 터 리 를 되 돌려 줍 니 다.주의 process.cwd() __dirname의 차이 점 은 전 자 는 프로 세 스 가 시 작 될 때의 위치 이 고 후 자 는 스 크 립 트 의 위치 이 며 이들 은 일치 하지 않 을 수 있 습 니 다.
on()
process 대상 은 EventEmitter 인 터 페 이 스 를 배 치 했 습 니 다.process.on() 방법 으로 각종 사건 을 감청 하고 리 셋 함 수 를 지정 할 수 있 습 니 다.예 를 들 어 시스템 이 프로 세 스 종료 신 호 를 보 낼 때 서버 를 닫 고 프로 세 스 를 종료 합 니 다.

process.on('SIGTERM', function () {
 server.close(function () {
 process.exit(0);
 });
});
exit()process.exit()Node 는 현재 프로 세 스(동기 화)를 즉시 종료 합 니 다.매개 변 수 는 종료 상태 코드 이 고 0 은 성공 을 표시 하 며 0 이상 의 임 의 정수 가 실 패 를 표시 합 니 다.
kill()process.kill() 특정 id 의 프로 세 스process.pid에 신 호 를 보 내 는 데 사 용 됩 니 다.기본 값 은 SIGINT 신호 입 니 다.현재 프로 세 스 죽 이기:

process.kill(process.pid, 'SIGTERM');
이름 은 kill 이지 만 사실은process.kill() 신 호 를 보 내 는 것 만 책임 집 니 다.신 호 를 보 낸 후에 이 지정 한 프로 세 스 를 어떻게 처리 하 는 지 는 신호 종류 와 이 신 호 를 받 은 후에 어떤 조작 을 했 는 지(예 를 들 어 process.exit() 또는 console.log('Ignored this single')에 달 려 있 습 니 다.
Child Process 모듈
child_process 모듈 은 하위 프로 세 스 를 만 들 고 제어 하 는 데 사 용 됩 니 다.그 중에서 가장 핵심 적 인 것 은 .spawn() 이 고 다른 API 는 특정한 장면 에 대한 패키지 라 고 할 수 있 습 니 다.사용 하기 전에 먼저 require 가 들 어 와 야 합 니 다:

const cp = require('child_process');
exec(command[, options][, callback])exec()방법 은 셸 명령 을 실행 하 는 데 사 용 됩 니 다.첫 번 째 매개 변 수 는 문자열 형식의 명령 입 니 다.두 번 째 매개 변 수 는 하위 프로 세 스 가 실 행 될 때의 맞 춤 형 작업 을 지정 하 는 데 사 용 됩 니 다.세 번 째 매개 변 수 는 명령 을 실행 한 리 셋 함 수 를 설정 하 는 데 사 용 됩 니 다.예 를 들 어 특정한 디 렉 터 리/Users/huangtengfei/abc 에서 ls -l명령 을 실행 합 니 다.

cp.exec('ls -l', {
 cwd: '/Users/huangtengfei/abc'
}, (error, stdout, stderr) => {
 if (error) {
 console.error(`exec error: ${error}`);
 return;
 }
 console.log(`stdout: ${stdout}`);
 console.log(`stderr: ${stderr}`);
})
spawn(command[, args][, options])spawn()키 프로 세 스 를 만들어 특정 명령 을 수행 하 는 데 사 용 됩 니 다.exec() 와 달리 리 셋 함수 가 없고 감청 이벤트 로 만 실행 결 과 를 얻 을 수 있 습 니 다.하위 프로 세 스 가 장시간 실행 되 는 경우 에 적용 되 며 실시 간 으로 결 과 를 출력 할 수 있 습 니 다.

const ls = cp.spawn('ls', ['-l']);

ls.stdout.on('data', (data) => {
 console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
 console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
 console.log(`child process exited with code $[code]`);
});
spawn 을 사용 하면 간단 한 데 몬 을 실행 할 수 있 습 니 다.작업 프로 세 스 가 정상적으로 종료 되 지 않 을 때 작업 프로 세 스 를 다시 시작 합 니 다.

/* daemon.js */
function spawn(mainModule) {
 const worker = cp.spawn('node', [ mainModule ]);

 worker.on('exit', function (code) {
  if (code !== 0) {
   spawn(mainModule);
  }
 });
}

spawn('worker.js');
fork(modulePath[, args][, options])fork()키 프로 세 스 를 만 들 때 node 스 크 립 트 를 실행 합 니 다.fork('./child.js') spawn('node', ['./child.js']) 에 해당 합 니 다.fork 는 부자 프로 세 스 사이 에 통신 관(fork()의 반환 값)을 만들어 프로 세 스 간 통신 에 사용 하 는 것 과 차이 가 있 습 니 다.이 통신 파이프 대상 에 대해 message 이 벤트 를 감청 할 수 있 으 며,하위 프로 세 스 가 되 돌아 오 는 정 보 를 가 져 올 수도 있 고,하위 프로 세 스에 메 시 지 를 보 낼 수도 있다.

/* main.js */
const proc = cp.fork('./child.js');
proc.on('message', function(msg) {
 console.log(`parent got message: ${msg}`);
});
proc.send({ hello: 'world' });

/* child.js */
process.on('message', function(msg) {
 console.log(`child got message: ${msg}`);
});
process.send({ foo: 'bar' });
클 러 스 터 모듈
Node.js 기본 단일 프로 세 스 가 실행 되 지만 다 중 핵 컴퓨터 의 자원 을 이용 할 수 없습니다.cluster 모듈 의 등장 은 이 문 제 를 해결 하기 위 한 것 입 니 다.서버 프로그램 을 개발 할 때 cluster 를 통 해 메 인 프로 세 스 와 여러 워 커 프로 세 스 를 만 들 수 있 습 니 다.모든 워 커 프로 세 스 가 하나의 핵 에서 실 행 될 수 있 도록 메 인 프로 세 스 감청 포트 와 배포 요청 을 통일 할 수 있 습 니 다.

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
 console.log(`Master ${process.pid} is running`);

 // Fork workers.
 for (let i = 0; i < numCPUs; i++) {
 cluster.fork();
 }

 cluster.on('exit', (worker, code, signal) => {
 console.log(`worker ${worker.process.pid} died`);
 });
} else {
 // Workers can share any TCP connection
 // In this case it is an HTTP server
 http.createServer((req, res) => {
 res.writeHead(200);
 res.end('hello world
'); }).listen(8000); console.log(`Worker ${process.pid} started`); }
상용 속성 및 방법
isMaster/isWorkercluster.isMaster 현재 프로 세 스 가 주 프로 세 스 인지 아 닌 지 를 판단 하 는 데 사 용 됩 니 다.cluster.isWorker현재 프로 세 스 가 작업 프로 세 스 인지 아 닌 지 를 판단 하 는 데 사 용 됩 니 다.둘 다 불 값 을 되 돌려 줍 니 다.
workerscluster.workers는 모든 워 커 프로 세 스 를 포함 하 는 대상 입 니 다.key 는worker.id이 고 value 는 워 커 프로 세 스 대상 입 니 다.

//      workers
function eachWorker(callback) {
 for (const id in cluster.workers) {
 callback(cluster.workers[id]);
 }
}
eachWorker((worker) => {
 worker.send('big announcement to all workers');
});
fork([env])cluster.fork()방법 은 워 커 프로 세 스 를 새로 만 드 는 데 사 용 됩 니 다.기본 컨 텍스트 는 메 인 프로 세 스 를 복사 하고 메 인 프로 세 스 만 호출 할 수 있 습 니 다.
상용 이벤트
listening
작업 프로 세 스 가 listening 방법 을 호출 하면 listening 사건 이 발생 합 니 다.이 사건 은cluster.on('listening')감청 할 수 있 습 니 다.
예 를 들 어 워 커 프로 세 스 가 연 결 될 때마다 로그 정 보 를 출력 합 니 다.

cluster.on('listening', (worker, address) => {
 console.log(
 `A worker is now connected to ${address.address}:${address.port}`);
});
exit
작업 프로 세 스 가 끊 겼 을 때 exit 이벤트 가 발생 합 니 다.이 이 벤트 는cluster.on('exit') 감청 할 수 있 습 니 다.
예 를 들 어 워 커 를 자동 으로 다시 시작 합 니 다:

cluster.on('exit', (worker, code, signal) => {
 console.log('worker %d died (%s). restarting...',
 worker.process.pid, signal || code);
 cluster.fork();
});
작업 자 대상
worker 대상 은cluster.fork() 의 반환 값 으로 worker 프로 세 스 를 대표 합 니 다.
worker.idworker.id 는 현재 worker 의 유일한 표지 이자 cluster.workers 에 저 장 된 key 값 입 니 다.
worker.process
모든 워 커 프로 세 스 는child_process.fork()를 통 해 생 성 되 며,이 프로 세 스 대상 은worker.process에 저 장 됩 니 다.
worker.send()worker.send() 메 인 프로 세 스에 서 하위 프로 세 스에 메 시 지 를 보 내 고,하위 프로 세 스에 서 메 시 지 를 감청 하고process.on() 메 시 지 를 보 냅 니 다.

if (cluster.isMaster) {
 const worker = cluster.fork();
 worker.send('hi there');
} else if (cluster.isWorker) {
 process.on('message', (msg) => {
 process.send(msg);
 });
}
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기