앞서
nodejs는 v0.6.x 이후에 모듈 클러스터를 추가하여 멀티 프로세스를 구현하고 child_process 모듈을 사용하여 프로세스를 생성 및 관리하여 멀티 코어에서 프로그램 성능을 높였습니다. CPU 머신 성능. 이번 글에서는 클러스터 모듈을 이용하여 생성된 멀티스레드가 어떻게 데이터를 공유하는지 소개하겠습니다.
프로세스 간 데이터 공유
먼저 간단한 예를 들어보겠습니다.
var cluster = require('cluster'); var data = 0;//这里定义数据不会被所有进程共享,各个进程有各自的内存区域 if (cluster.isMaster) { //主进程 var numCPUs = require('os').cpus().length; for (var i = 0; i < numCPUs; i++) { var worker = cluster.fork(); } data++; console.log('DATA VALUE in MainProcess: %d ' , data); } else { //子进程,会被调用numCPUs次 data++; console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data); }
실행 결과는 다음과 같습니다.
메인 프로세스 코드 블록과 하위 프로세스 코드 블록 외부에 변수를 선언하면 안되는 이유 전역 변수가 되나요? 대답은 '아니요'입니다. 각 프로세스는 메모리에 자신만의 영역을 갖고 있기 때문에 data++ 연산은 자신만의 영역에서 수행되는데, 이는 변수 데이터가 공유되지 않음을 의미합니다. 그렇다면 프로세스 간에 데이터를 공유하는 방법은 무엇입니까? 다음 코드를 살펴보겠습니다.
var cluster = require('cluster'); var http = require('http'); if (cluster.isMaster) { var numCPUs = require('os').cpus().length; var data = 0; // 启动多个进程. for (var i = 0; i < numCPUs; i++) { //增加一个进程 var worker_process = cluster.fork(); //侦听子进程的message事件 worker_process.on('message', function(msg) { if (msg.cmd && msg.cmd == 'notifyRequest') { data++; console.log('DATA VALUE : %d ', data); } }); } } else { process.send({ cmd: 'notifyRequest' }); }
실행 결과는 다음과 같습니다.
따라서 데이터를 공유해야 하는 경우 이 목적을 달성하려면 프로세스 간에 메시지 알림을 사용해야 합니다.