网站动画用什么程序做培训机构有哪些
news/
2025/9/23 6:57:54/
文章来源:
网站动画用什么程序做,培训机构有哪些,.red域名做网站好不好,那些网站后台做推广效果好在实际项目中#xff0c;如果遇到需要大计算量的操作#xff0c;按需fork#xff08;分叉#xff09;其实不是一个好的选择。因为fork的子进程也是V8#xff08;NodeJS的核心引擎#xff09;的新实例#xff0c;每创建一个新实例#xff0c;需要约30毫秒启动时间#…在实际项目中如果遇到需要大计算量的操作按需fork分叉其实不是一个好的选择。因为fork的子进程也是V8NodeJS的核心引擎的新实例每创建一个新实例需要约30毫秒启动时间和至少10MB的初始内存。也就是说创建进程是有代价的你不能创建太多也不能频繁创建。那样达不到提高进程效率的目的。那么该如何高效优雅的使用子进程呢工作池工作池合理的办法是创建一个可用的工作池在池中存放足够多的进程并可以随时分配使用。我们对上一节讲的内容进行升级当父进程发送一个任务给子进程时子进程执行任务。并将结果向主进程反馈。在父进程中需要的代码会是这样的function doWork(job,cb){var child cp.fork(./worker);//发送工作给子进程child.send(job);//希望子进程返回一个确切的消息child.once(message,function(result){cb(null,result);})
}嗯...这样讲有些凌乱这一章比较复杂最好的办法还是写一个完整的代码做为例子1、father.js主进程var http require(http);
var makePool require(./pooler);
var runJob makePool(./worker);http.createServer(function(req,res){runJob(some dummy job,function(er,data){console.log(father callback get:,data);if(er){return res.end(get an error:er.message)}res.end(work pool);})}).listen(8000)当有客端访问时触发runjob开始启行工作。2、worker.jsprocess.on(message,function(job){console.log(worker get msg:,job);for(var i0;i10;i){console.log(worker send:,job,i);process.send(finish job:jobi);}})收到father主进程发来的消息时使用process.send()方法调用子进程向工作池发出工作任务。3、pool.js工作池接收worker消息用工作池完成操作并反馈给主程序。代码中做了详细的注释 就不单独对代码做解析了 var cp require(child_process);
//获取CPU数量有几个CPU就创建几个子进程这样就可以最大化的利用机器性能
var cpus require(os).cpus().length;//模块导出函数
module.exports function(workModule){//等待任务队列当工作任务被下发但没有闲工作进程时放到此队列var awaiting [];//存放准备就绪的工作进程var readyPool [];//当前的工作子进程数量工作池的大小var poolSize 0;return function doWork(job,cb){//如果工作池数量已经最大并且没有准备就绪的工作子进程也就是所有工作子进程都在工作中那么排队等待if(!readyPool.length poolSize cpus){//压入到等待队列等待后续处理return awaiting.push([dowork,job.cb]);}//取得一个可用的工作子进程或fork分叉一个新的子进程增加工作池的大小var child readyPool.length ? readyPool.shift() : (poolSize, cp.fork(workModule));{//子进程是否完成回调的标记var cbTriggered false;//初始阶段移除子进程上的监听确保每个子进程只拥有一次监听child.removeAllListeners();//错误child.once(error,function(err){//未回调if(!cbTriggered){//回调返回为错误cb(err);//回调标识改为true已回调cbTriggered true;} //结束子进程child.kill();//这里不用操作工作池poolSize--因为kill会触发exit事件在exit事件中操作工作池});//子进程退出了不明原因的意外退出、被kill()等都触发child.once(exit,function(code,signal){//未回调if(!cbTriggered){//回调返回信息cb(new Error(Child exited with code:code))}//工作池正在工作的子进程数大小减一poolSize --;//退出的子进程是否在准备好的子进程数组中var childIdx readyPool.indexOf(child);if(childIdx -1){//从准备好的子进程数组中移除readyPool.splice(childIdx,1);}})//获取父进程发来的消息child.on(message,function(msg){console.log(pool get msg:,msg);cb(null,msg);cbTriggered true;readyPool.push(child);//如何等待区有内容处理之if(awaiting.length){setImmediate.apply(null,awaiting.shift());}//向父进程发送消息}).send(job);}//child区域结束}
}执行效果图中展示的是工作流程可见此种方法可以达到我们的预期工作池很OK。对于实际编程中遇到的消耗比较大的情况使用此种方法可以极大的提高效率且本文已经将工作池写成了模块(pooler.js建议收藏nodejs开发在某个时候一定会遇到适合的场景的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911655.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!