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"等版本目录中考过去就可以正确执行了。

时间: 2024-12-29 04:23:06

node-webkit中子进程的应用的相关文章

关于node.js的进程管理

如果是单纯的运行一个node进程,那会比较简单,例如: node ./example.js 但是一般来说,当我们运行一个node进程之后,我们可能希望对这个进程进行更多的管理,例如,当node程序是一个server服务时,我们就有更多的需求. 例如: 1.服务挂掉的时候自动重启. 2.列出所有服务,包括服务的信息. 3.能够重启/终止某个服务. 4.为服务的运行记录日志. 1.服务挂掉的时候自动重启. 对于这个需求,我们需要做的是把服务进程当做一个子进程来运行,当子进程不幸挂了,父进程将其重启,

Node.js的进程管理

众所周知Node基于V8,而在V8中JavaScript是单线程运行的,这里的单线程不是指Node启动的时候就只有一个线程,而是说运行JavaScript代码是在单线程上,Node还有其他线程,比如进行异步IO操作的IO线程.这种单线程模型带来的好处就是系统调度过程中不会频繁进行上下文切换,提升了单核CPU的利用率. 但是这种做法有个缺陷,就是我们无法利用服务器CPU多核的性能,一个Node进程只能利用一个CPU.而且单线程模式下一旦代码崩溃就是整个程序崩溃.通常解决方案就是使用Node的clu

深入Node.js的进程与子进程:从文档到实践

欢迎关注Github仓库,这是一个自2018年起持续更新的前端&算法开源博客.目前已有node学习.js面试笔记.css3动画设计.webpack4系列教程.设计模式.剑指offer·js版等多个系列. 仓库地址:https://github.com/dongyuanxin/blog 进程:process模块 process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API.从文档出发,管中窥豹,进一步认识和学习 process 模块: 如何处理命令参数?

node.js学习进程1

1.下载安装nodejs: 2.查看nodejs/npm版本(cmd:node -v/npm -v): 3.创建一个web服务器: 1 var http = require('http') 2 3 var server = http.createServer(function(req/*请求*/,res/*响应*/){ 4 res.writeHead(200/*请求成功状态*/,{'Content-Type':'text/plain'}/*类型*/) 5 res.end('Hello World

node webkit(nw.js) 设置自动更新

原理:把更新的文件放在服务器上,设置一个客户端版本号,通过接口获取服务器上的版本,如果高于本地的版本就下载服务器上的代码,低于或等于就不更新 代码如下: <script> var http = require('http'); var fs = require('fs'); var request = require('request'); var unzip = require('unzip2'); var Driver = function () { this.timer = ''; th

node.js学习进程2(url)

url三个方法.url.parse(),解析url地址:url.formate(),将一个url对象格式化为url字符串:url.resolve(),接受两个参数,将两个参数拼接为浏览器可以识别的格式. 1.node环境中输入url,输出url的上述三个方法. 2.url.parse('http://imooc.com/course/list') 解析结果: { protocol:'http:',/*底层协议*/ slashes:true,/*是否有协议的双斜线*/ auth:null, hos

从零系列--node爬虫利用进程池写数据

1.主进程 const http = require('http'); const fs = require('fs'); const cheerio = require('cheerio'); const request = require('request'); const makePool = require('./pooler') const runJob = makePool('./worker') var i = 0; var url = "http://xxx.com/articl

node webkit (nw.js) 无法调试的结局方案之一

项目,当时主要内容是由别人做的!过后回到家中,自己研究了下这方面.结果发现我的 nw 客户端不可以调试!在网上各种找办法,没找到,深感绝望,突然看到 (https://github.com/nwjs/nw.js/blob/nw17/docs/For%20Users/Getting%20Started.md) 上面说,建议你选择 sdk 版本! nw.js sdk 版本什么东西?抱着试一试的心态下了一个! 熟悉的界面又回来了!

Node webkit启动最大化窗口

<!DOCTYPE html> <html> <head>     </head> <body>     <p style="text-align:center;margin-top:10%;color:green;font-weight:bold;font-size:12px">正在加载中...</p>     <script language="javascript" ty