NetEase / pomelo

A fast,scalable,distributed game server framework for Node.js.
http://pomelo.netease.com
MIT License
11.86k stars 2.9k forks source link

建议:Handler返回的是函数,pomelo-loader会多次执行该函数,建议只执行一次! #1167

Open sss316 opened 4 years ago

sss316 commented 4 years ago

module.exports = function(app) { return new Handler(app); }; 这个是demo的写法,如果该Handler需要读取文件,项目会多次创建Handler并且多次读取文件,导致性能下降。 程序员自己写逻辑难免出现这种问题, 建议:从底层防范,让module.exports永远执行一次。

wangkunmeng commented 4 years ago

pomelo\lib\common\service\handlerService.js你看看这个服务内代码

whtiehack commented 4 years ago
let handler
module.exports = function(app) {
if(handler)return handler;
return handler = new Handler(app);
};

你自己改成这样不就完了.

sss316 commented 4 years ago

@wangkunmeng 看代码干啥,直接测试就能看到一直调用。 @whtiehack 目前我就是这么干的,直接拿demo改项目,容易误导新手。

raoyaoiau commented 3 years ago

只是执行了两次,启动一次,加载一次。

sss316 commented 3 years ago

同一个类型服务器只调用2次,但是别的服务器类型为了rpc远程调用,启动时也会调用该module.exports。所以会执行很多次!

如果该函数有大量运算或文件读写,就需要判断服务器类型,并且使用 @whtiehack 的写法。

let handler; module.exports = function(app) { if(handler)return handler; handler = new Handler(app); if(app.getServerType()!='conn'){ /////do sth.///// } return handler; };

raoyaoiau commented 3 years ago

除handle所在服务器,只有connector会去,new其他的服务器的handler. 这是为了远程调用,但是这也没有多次执行该函数,一个connector只是执行一个而已, 疑惑,