Nodejs中解決cluster模塊的多進程如何共享數(shù)據(jù)問題
前述
nodejs在v0.6.x之后增加了一個模塊cluster用于實現(xiàn)多進程,利用child_process模塊來創(chuàng)建和管理進程,增加程序在多核CPU機器上的性能表現(xiàn)。本文將介紹利用cluster模塊創(chuàng)建的多線程如何共享數(shù)據(jù)的問題。
進程間數(shù)據(jù)共享
首先舉個簡單的例子,代碼如下:
var cluster = require('cluster'); var data = 0;//這里定義數(shù)據(jù)不會被所有進程共享,各個進程有各自的內(nèi)存區(qū)域 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 { //子進程,會被調(diào)用numCPUs次 data++; console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data); }
運行結(jié)果如下:
為什么我們在主進程代碼塊以及子進程代碼塊之外來聲明的變量不應(yīng)該是全局變量么?答案是否定的。因為每個進程在內(nèi)存都有各自的區(qū)域,因此data++操作是在各自的區(qū)域內(nèi)進行的,也就是說變量data沒被共享。那么怎么來在各進程之間共享數(shù)據(jù)呢?來看下面的代碼:
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' }); }
運行結(jié)果如下:
因此如果需要共享數(shù)據(jù),需要在進程間使用消息通知來達到這個目的。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Postman xmysql不切換環(huán)境緩存數(shù)據(jù)到本地
這篇文章主要為大家介紹了Postman xmysql不切換環(huán)境緩存數(shù)據(jù)到本地示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02node.js中的events.emitter.listeners方法使用說明
這篇文章主要介紹了node.js中的events.emitter.listeners方法使用說明,本文介紹了events.emitter.listeners 的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12詳解基于node.js的腳手架工具開發(fā)經(jīng)歷
這篇文章主要介紹了詳解基于node.js的腳手架工具開發(fā)經(jīng)歷,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01