什么是`fs.appendFile()`的primefaces性保证?
fs.appendFile()
的文档在primefaces性保证方面含糊不清。
我特别想知道,如果在同一个文件上进行两次或多次调用,而不是等待中间的callback,数据是否可能交错或丢失(例如,由于写入重叠区域)。 例如,拿这个代码:
fs.writeFileSync('blort.bin', ''); for (let i = 0; i < 10; i++) { const data = Buffer.alloc(65536, i); fs.appendFile('blort.bin', data, () => {}); }
假设没有文件系统错误,并且没有其他进程正在写入有问题的文件,那么在完成所有附加操作之后,Node是否会做出以下保证?
- 该文件的大小正好是640k。
- 该文件由10个64k数据块组成,每个数据块均包含一个字节值。
我也很好奇,如果有任何序列化保证(虽然我不假设)。 也就是说,附件是否保证按顺序执行?
更新:增加了澄清,这是唯一的代码在文件上的代码。
就我所知,您的附加将按顺序发生,除非另一个进程正在写入目标文件,否则不会覆盖现有数据。
节点是单线程的(从正在运行的应用程序的angular度来看),并在内部对文件写入进行排队,因此如果将1
2
和3
写入文件,则文件将包含123
。
节点不会启动新的线程来处理IO,但这是运行时的一个特性,对开发人员来说是隐藏的。
UPDATE
在第一次阅读时,我错过了您的要求,即您的追加发生在callback空白或不起作用的多个呼叫中。
这极大地改变了事情。
如果使用asynchronous调用,如fs.appendFile()
,则必须提供必须检查错误的callback。 如果您在不等待callback结束的情况下堆叠asynchronous调用, 则不能保证您的写入将按顺序进行,也不会覆盖以前的数据。
底线: 不要使用asynchronous函数没有适当的callback,总是检查错误。
否则打破了Node的事件驱动模型的整个想法。
我通常解释的方式是考虑到,在asynchronous调用中, 无法预测callback将由于多种因素(包括CPU和IO负载)而被触发 。
如果您不知道何时触发callback,则无法预测多个呼叫将按顺序运行。
更新2
要清楚的是,你不能在不提供callback的情况下调用asynchronous函数,并保证任何预期的行为。
从事件angular度考虑:
fs.appendFile()
向IO线程添加事件处理程序,并将包含其参数的事件发送到IO线程。
一旦操作完成,这个事件处理程序被触发,这是你的callback或将触发你的callback。
无需等待手术完成,就不能保证手术成功或完成了您的预期。
- 在expressjs app.VERB调用中next()和next('route')有什么区别?
- node.js是否有像__file__和__line__之类的c ++预处理器macros?
- 用于Firebase性能的云端函数
- CSS编辑/压缩和Source Maps v3
- 如何聚合数组中ObjectID的出现次数?
- Slack Botkit – 如何从“reaction_added”事件中获取消息的内容
- 是否有可能部署一个Node.js应用程序到Heroku没有一个networkingdynamic?
- Node.js事件与服务器端的线程编程
- http.get()方法和var request = require('request')有什么区别