nodejs 의 process 프로 세 스 를 자세히 설명 합 니 다.

node 는 운영 체제 에 대해 추상 적 인 작업 을 많이 했 지만 시스템 에 존재 하 는 프로 세 스 와 직접 상호작용 을 하고 작업 서브 프로 세 스 를 만 들 수 있 습 니 다.node 는 이벤트 순환 에 사용 되 는 스 레 드 이지 만 이 이벤트 순환 외 에 다른 프로 세 스(스 레 드)를 만들어 작업 에 참여 할 수 있 습 니 다.
프로 세 스 모듈
process 모듈 은 현재 node 프로 세 스 의 설정 을 가 져 오 거나 수정 할 수 있 습 니 다.다른 모듈 을 원 하지 않 습 니 다.process 는 전역 프로 세 스(node 메 인 프로 세 스)입 니 다.process 변 수 를 통 해 직접 접근 할 수 있 습 니 다.
process 는 EventEmitter 인 터 페 이 스 를 실 현 했 습 니 다.exit 방법 은 프로 세 스 가 종 료 될 때 실 행 됩 니 다.프로 세 스 가 종료 되면 이벤트 순환 을 실행 하지 않 기 때문에 리 셋 함수 가 없 는 코드 만 실 행 됩 니 다.다음 예 에서 setTimeout 의 문 구 는 실행 할 수 없습니다.

process.on('exit', function () {
  setTimeout(function () {
    console.log('This will not run');
  }, 100);
  console.log('Bye.');
});
node 를 접촉 한 후에 메 인 이벤트 순환 에 영향 을 주 는 이상 이 전체 node 프로 세 스 를 지연 시 킬 수 있 습 니 다.이것 은 상당히 심각 한 문제 일 것 입 니 다.그래서 프로 세 스 는 또 다른 유용 한 사건 인 uncaught Exception 을 제공 하여 이 문 제 를 해결 할 것 입 니 다.그 는 이상 을 잡 아서 당신 에 게 처리 할 것 입 니 다.

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});
setTimeout(function () {
  console.log('This will still run.');
}, 500);
// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');
 우 리 는 위의 예 를 살 펴 보 자.우 리 는 uncaught Exception 사건 을 등록 하여 시스템 이상 을 포착 했다.nonexistentFunc()로 실 행 될 때 이 함수 가 정의 되 지 않 아 이상 을 던 집 니 다.javascript 은 해석 적 인 언어 이기 때문에 nonexistentFunc()방법 위의 문 구 는 영향 을 받 지 않 고 그의 아래 문 구 는 실행 되 지 않 습 니 다.그래서 그의 집행 결 과 는 다음 과 같다.
Caught exception: ReferenceError: nonexistentFunc is not defined
This will still run.
우 리 는 예 를 하나 더 보 자.

var http = require('http');
var server = http.createServer(function(req,res) {
  res.writeHead(200, {});
  res.end('response');
  badLoggingCall('sent response');
  console.log('sent response');
});
process.on('uncaughtException', function(e) {
  console.log(e);
});
server.listen(8080);
 이 예 에서 우 리 는 웹 서버 를 만 들 었 습 니 다.요청 을 처리 한 후에 badLoggingCall()방법 을 실행 할 것 입 니 다.이 방법 은 존재 하지 않 기 때문에 이상 하 게 던 질 수 있다.그러나 저희 가 등록 한 uncaughtException 사건 은 이상 처리 되 어 서버 가 영향 을 받 지 않 고 계속 실 행 될 수 있 습 니 다.서버 에 오류 로 그 를 기록 할 것 입 니 다.
[ReferenceError: badLoggingCall is not defined] 
 현재 프로 세 스 와 대화 하기
node 는 프로 세 스 의 속성 을 제공 합 니 다.다음 과 같 습 니 다.
process.version:현재 node 인 스 턴 스 를 포함 하 는 버 전 번호;
process.installPrefix:설치 경 로 를 포함 합 니 다.
process.platform:node 가 실행 하 는 운영 체제 환경 을 열거 하면 커 널 관련 정보 만 표시 합 니 다.예 를 들 어 Liux 2,darwin,"Redhat ES3","Windows 7","OSX 10.7"등 이 아 닙 니 다.
process.uptime():현재 프로 세 스 가 실 행 된 시간(초)을 포함 합 니 다.
process.getgid(),process.setgid():group id 를 가 져 오 거나 설정 합 니 다.
process.getuid(),process.setuid():user id 를 가 져 오 거나 디자인 합 니 다.
process.pid:프로 세 스 id 가 져 오기;
process.title:프로 세 스 이름 설정 하기;
process.execPath:현재 node 프로 세 스 의 실행 경로,예 를 들 어/usr/local/bin/node;
process.cwd():현재 작업 디 렉 터 리;
process.memory Usage():node 프로 세 스 메모리 의 사용 현황,rss 는 ram 의 사용 상황 을 대표 합 니 다.vsize 는 총 메모리 의 사용 크기 를 대표 합 니 다.ram 과 swap 를 포함 합 니 다.
process.heapTotal,process.heapUsed:각각 v8 엔진 메모리 분배 와 사용 중인 크기 를 대표 합 니 다.
 이벤트 순환 과 ticker
node 에 서 는 process.nextTick()방법 을 제공 하여 이벤트 순환 과 지연 에 접근 할 수 있 도록 합 니 다.그 는 setTimeout()과 비슷 하 다.그 는 다음 tick 에서 실 행 될 것 이 며,사건 마다 한 번 씩 실 행 될 것 이다.우리 에 게 는 예 가 하나 있다.

var http = require('http');
var s = http.createServer(function(req, res) {
  res.writeHead(200, {});
  res.end('foo');
  console.log('http response');
  process.nextTick(function(){console.log('tick')});
});
s.listen(8000);
요청 이 올 때 로그'http response'와'tick'을 기록 합 니 다.요청 이 없 을 때 이벤트 마다 이벤트 순환 을 실행 하고 tick 를 출력 합 니 다.
또한,nextTick 이 만 든 리 셋 함 수 는 격 리 성 을 가지 고 있 으 며,그들 사이 에는 서로 영향 을 주지 않 습 니 다.

process.on('uncaughtException', function(e) {
  console.log(e);
});
process.nextTick(function() {
  console.log('tick');
});
process.nextTick(function() {
  iAmAMistake();
  console.log('tock');
});
process.nextTick(function() {
  console.log('tick tock');
});
console.log('End of 1st loop');
이 예 에서 먼저'End of 1st loop'을 출력 한 다음 에 nextTick 의 리 셋 함 수 를 순서대로 출력 합 니 다.첫 번 째 는'tick'을 정상적으로 출력 합 니 다.두 번 째 는 의도 적 으로 설정 한 이상 이 이상 정 보 를 출력 하고'tock'을 출력 하지 않 습 니 다.nextTick 리 셋 함수 의 격 리 성 때문에 세 번 째 는'tick tock'을 출력 합 니 다.결 과 는 다음 과 같다.
End of 1st loop
tick
[ReferenceError: iAmAMistake is not defined]
tick tock
하위 프로 세 스
node 는 child 를 제공 합 니 다.process 모듈 은 주 프로 세 스 가 하위 프로 세 스 를 만 들 수 있 도록 합 니 다.그러면 더 많은 서버 자원 을 사용 하고 더 많은 cpu 를 사용 할 수 있 습 니 다.이러한 개념 은 앞의 장 에서 소개 되 어 있 습 니 다.node 는 child 를 제공 합 니 다.process.spawn()과 child프로 세 스 exec()가 이 기능 을 실현 시 켜 드 리 겠 습 니 다.다음은 따로 소개 하 겠 습 니 다.
  child_process.exec( )
exec 의 간단 한 예 를 살 펴 보 겠 습 니 다.그 는 키 프로 세 스 를 만 들 었 습 니 다.첫 번 째 매개 변 수 는 셸 명령 이 고 두 번 째 매개 변 수 는 반전 함수 이 며 결 과 를 처리 합 니 다.

var cp = require('child_process');
cp.exec('ls -l', function(e, stdout, stderr) {
  if(!e) {
    console.log(stdout);
    console.log(stderr);
  }
});
exec()는 options 의 인 자 를 전달 할 수 있 습 니 다.

var options = { 
 encoding: 'utf8',
 timeout: 0,
 maxBuffer: 200 * 1024,
 killSignal: 'SIGTERM',
 setsid: false,
 cwd: null,
 env: null 
};
var cp = require('child_process');
cp.exec('ls -l', options, function(e, stdout, stderr) {
  if(!e) {
    console.log(stdout);
    console.log(stderr);
  }
});
encoding:I/O 흐름 의 인 코딩 형식;
timeout:프로 세 스 시간 초과;
kill Signal:시간 이나 버퍼 가 제한 을 초과 할 때 프로 세 스 를 종료 하 는 신호;
max Buffer:stdout 또는 stderr 가 증가 할 수 있 는 최대 치;
setsid:프로 세 스 에 새 세 션 을 만 들 지 여 부 를 결정 합 니 다.
cwd:프로 세 스 의 초기 작업 디 렉 터 리 는 null 일 때 node 의 현재 작업 디 렉 터 리 를 사용 합 니 다.
env:프로 세 스 의 환경 변수.
  child_process.spawn( )
  child_process.spawn()비 childprocess.exec()가 더욱 강하 고 유연 합 니 다.예 는 다음 과 같 습 니 다.

var cp = require('child_process');
var cat = cp.spawn('cat');
cat.stdout.on('data', function(d) {
  console.log(d.toString());
});
cat.on('exit', function() {
  console.log('kthxbai');
});
cat.stdin.write('meow');
cat.stdin.end();
위 에서 말 한 것 은 소 편 이 소개 한 nodejs 의 process 프로 세 스 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다!

좋은 웹페이지 즐겨찾기