前述
nodejs在v0.6.x之後增加了一個模組cluster用於實現多進程,利用child_process模組來創建和管理進程,增加程式在多核心CPU機器上的效能表現。本文將介紹利用cluster模組所建立的多執行緒如何共享資料的問題。
進程間資料共享
首先舉個簡單的例子,程式碼如下:
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++操作是在各自的區域內進行的,也就是說變數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' }); }
運作結果如下:
因此如果需要共享數據,需要在進程間使用訊息通知來達到這個目的。