rag*_*lka 38 io localization node.js
我知道在节点开发时,你应该总是试图避免阻塞(同步)函数并使用异步函数,但是我会稍微测试一下它们如何比较.
我需要打开一个包含i18n数据(如日期和时间格式等)的json文件,并将该数据传递给使用此数据格式化我的视图中的数字等的类.
在回调中开始包装所有类的方法会有点尴尬,所以如果可能的话,我会使用同步版本.
console.time('one');
console.time('two');
fs.readFile( this.dir + "/" + locale + ".json", function (err, data) {
if (err) cb( err );
console.timeEnd('one');
});
var data = fs.readFileSync( this.dir + "/" + locale + ".json" );
console.timeEnd('two');
Run Code Online (Sandbox Code Playgroud)
这导致我的控制台中的以下行:
two: 1ms
one: 159ms
Run Code Online (Sandbox Code Playgroud)
似乎fs.readFileSync比fs.readFile快约150倍,并且需要大约1ms才能加载50KB的json文件(缩小).我所有的json文件大约是50-100KB.
我也在考虑以某种方式将这个json数据记忆或保存到会话中,以便每个会话只读取一次文件(或者当用户更改其语言环境时).我不完全确定如何做到这一点,这只是一个想法.
可以fs.readFileSync在我的情况下使用,还是以后会遇到麻烦?
Pet*_*ons 65
不,如您所述,在节点服务器中使用阻塞API调用是不正确的.您的网站对许多并发连接的响应将受到巨大冲击.它也只是公然违反了节点的#1原则.
节点工作的关键是,当它在等待IO时,它正在同时进行CPU /内存处理.这需要专门的异步调用.因此,如果您有100个客户端读取100个JSON文件,节点可以要求操作系统读取这100个文件,但在等待操作系统返回文件数据时,节点可以处理这100个网络请求的其他方面.如果您在其中有一个同步调用,则所有客户端处理在该操作完成时完全停止.因此,当您按顺序读取客户端1,2,3,4等文件时,客户端编号100的连接将等待,无需任何处理.这是Failville.
这是另一个类比.如果你去了一家餐馆而且是唯一的顾客,如果一个人坐在你身边,接过你的订单,煮熟,送给你,处理账单而没有与主人打交道的协调费用,你可能会得到更快的服务.女主人,服务员,主厨,线厨师,收银员等.然而,在餐厅有100名顾客,额外的协调意味着事情并行发生,餐厅的整体响应能力超出了单身人士的情况.试图自己处理100个客户.
lab*_*419 10
您正在使用同步读取来阻止异步读取的回调,请记住单个线程.现在我明白时差仍然是惊人的,但你应该尝试使用一个更长,更长时间阅读的文件,并想象很多很多客户都会这样做,只有这样才能获得成本.这应该回答你的问题,是的,如果你通过阻止IO服务数千个请求,你将遇到麻烦.
| 归档时间: |
|
| 查看次数: |
29422 次 |
| 最近记录: |