当前位置: 首页 > 面试题库 >

fs.readFileSync似乎比fs.readFile快-可以在生产环境中使用Web应用程序吗?

鲜于德业
2023-03-14
问题内容

我知道在节点中进行开发时,应始终尝试避免阻塞(同步)功能并使用异步功能,但是我进行了一些测试,以了解它们之间的比较。

我需要打开一个包含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');

This results in the following lines in my console:

two: 1ms
one: 159ms

看来fs.readFileSync比fs.readFile快150倍,并且加载50KBjson文件(最小化)大约需要1毫秒。我所有的json文件约为50-100KB。

我在想也许还以某种方式将这个json数据存储或保存到会话中,以便每个会话(或当用户更改其语言环境时)仅读取一次文件。我不完全确定该怎么做,这只是一个想法。
fs.readFileSync在我的情况下可以使用还是以后会遇到麻烦?


问题答案:

不,您无法在节点服务器中使用阻塞API调用。
您的网站对许多并发连接的响应能力将受到重大
打击。这也公然违反了节点的第一原则。

节点工作的关键在于,当它等待IO时,它同时在执行CPU /内存处理。这仅需要异步调用。因此,如果有100个客户端读取100个JSON文件,则节点可以要求操作系统读取这100个文件,但是在等待操作系统返回可用文件数据时,节点可以处理这100个网络请求的其他方面。如果您只有一个同步调用,则在该操作完成时,所有客户端处理将完全停止。因此,当您
依次读取客户端1、2、3、4等的文件时,客户端编号100的连接将等待任何处理。这是维尔维尔。

这是另一个比喻。如果您去一家餐馆而且是唯一的顾客,那么如果一个人坐着,接您的订单,将其烹饪,送达给您,并处理账单,而没有与房东/女主人,服务员,厨师长,厨师,收银员等。但是,餐厅有100位顾客,额外的协调意味着事情并行发生,餐厅的整体响应能力大大提高,超过了一个人的情况。试图自己处理100个客户。



 类似资料:
  • 在这个博客里,他们说。net标准2.0它有一个一致性状态。 在官方网站上,没有说如果。net standard 2.0是预览版或最终版。 但我想,.net标准2.0是最终版本,因为EF Core 2.0最终版已经过时,这使用了.net标准2.0.也许EF Cor可以是最终版,而.net标准1.0仍然是预览版,但我想这会很奇怪。 另外,我知道要使用.net标准,我必须使用VS2017 15.3,这是

  • Kibana 的配置很大程度上依赖于您的使用场景。如果只有自己使用,可以在自己的机器上运行 Kibana,配置它指向任何您想要交互的 Elasticsearch 实例。相反,如果有大量的 Kibana 使用者,需要多个 Kibana 实例连接至同一个 Elasticsearch 节点,来保证负载均衡。 尽管 Kibana 不是非常耗费资源,我们仍然建议运行 Kibana 的节点和 Elastics

  • 引言 Sentinel 目前已可用于生产环境,除了阿里巴巴以外,也有很多企业在生产环境中广泛使用 Sentinel。 生产环境的 Sentinel Dashboard 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则。sentinel-core 提供 API 和扩展接口来接收信息。开发者需要根据自己的环境,选取一个可靠的推送规则方式;同时,规则最好在控制台中集中管理。 监控,支持可靠、快

  • 问题内容: 我正在使用IdentityServer4和来自ASP.NET Core 3.0的React启动项目。预览4,它可以完美工作,直到构建解决方案并尝试使用dotnet命令从cmd提示符运行它为止。每次我启动应用程序时,它都会告诉我未指定密钥类型。 我没有尝试过各种有关生成证书的指南,因为我对.NET没有任何经验。我提到这一点是为了防止问题可能是由于生成证书的方式不正确引起的。 我也尝试过将

  • 问题内容: 对于那些在生产环境中运行Go后端的人: 运行Go Web应用程序的堆栈/配置是什么? 除了人们使用标准库net / http包来保持服务器运行之外,在该主题上我还没有看到太多内容。我阅读了使用Nginx将请求传递到Go服务器的信息- 使用Go的 Nginx 在我看来,这有点脆弱。例如,如果重新启动计算机(没有其他配置脚本),服务器将不会自动重新启动。 是否有更可靠的生产设置? 除了我的

  • 问题内容: 我正在努力使自己在Node.js中实现同步与异步,尤其是在读取html文件时。 在请求处理程序中,可以使用的同步版本如下: 使用readFile()的版本是什么? 我了解readFile是异步的,因此从理论上讲,我应该等待整个文件读取后再呈现,因此我应该引入addListener吗?我可能会混淆其他事情。 编辑:我试图重构这样的代码: 我得到一个空白页,我想这是因为它应该等待所有数据已