首页 > 代码库 > node-webkit中子进程的应用
node-webkit中子进程的应用
node-webkit客户端中应用本地数据库如果大量写入很多数据会导致主线程负责页面渲染和监听事件变慢。正如node介绍的那样,像这种CPU运算密集型操作,最好放到子进程中来处理。注意的是主进程和子进程的通讯与回调方法的执行。主进程与子进程是通过socket通讯,因些传递的参数只能是PlanObject型(json型),不能把回调函数什么的传过去。
主进程代码:mian.js
//子进程路径 var childpath=require(‘path‘).join(__dirname,"../childprocess/childprocess.js"); //生成子进程 var childprocess=require(‘child_process‘).fork(childpath); //子进程运行事件监听 childprocess.on("error",function(err,stdout,stderr){ console.error("childprocess ERROR:",err,stdout,stderr); }) // 异步回调 function Receipt(){ this.m={}; } Receipt.prototype={ push:function(id,method){ this.m[id]=method; }, invoke:function(id,args,scope){ if(!this.m[id])return; this.m[id].apply(scope,args); delete this.m[id]; }, remove:function(id){ if(this.m[id]) delete this.m[id]; } } //执行完消息的回调 var receipt = new Receipt(); /* 定义收到消息格式 { id:"sendedId", method:"childprocess method to call", err:"null or error" result:"sucess result" } */ //收到消息监听 childprocess.on("message",function(msg){ console.log("主进程收到消息",msg); if(msg&&msg.id){ receipt.invoke(msg.id,msg); } }); /* 定义发送消息格式 { method:childprocess.method, args:childprocess.method.arguments id:thisCalledUniqueId } */ var getMyMothod={method:"myMethod",args:[{"anyPlanetObj":"anyPlanetObj"},"two arg"],id:require(‘node-uuid‘)()}; receipt.push(getMyMothod.id,function(msg){ console.log("getMyMehtod callback called",msg); }); childprocess.send(getMyMothod);
子进程代码:/childprocess/childprocess.js
var childprocess={ test:function(feedbackid){ if(process.send)process.send({id:feedbackid,method:"test",err:null,result:"test feedback ok"}) }, myMethod:function(sessoinObj,currentStr,feedbackid){ try{ /*your logic here*/ if(process.send) process.send({id:feedbackid,method:arguments.callee.name,err:null,result:"your result data"}); }cathe(e){ if(process.send) process.send({id:feedbackid,method:arguments.callee.name,err:e,result:null}); } } } /*传入message消息的格式 {method:childprocess.method, args:childprocess.method.arguments id:thisCalledUnqueId} */ process.on("message",function(data){ if(data&&data.method){ data.args.push(data.id); childprocess[data.method].apply(childprocess,data.args) }else{ console.log("子进程","childprocess‘s message event no method!") } }) exports = module.exports = childprocess;
另外,如果是sqlite3在子进程中执行,在子进程中会缺少引用,子进程执行是在node内核中执行,它找的node_sqlite3.node目录就不一样,在sqlite3的包中的binding中创建文件夹为“node-v14-win32-ia32”再把node_sqlite3.node从别"node-webkit-v0.10.3-win32-ia32"等版本目录中考过去就可以正确执行了。
node-webkit中子进程的应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。