关于 fs.writeFile 异步方法几个同时执行的顺序问题
发布于 10 年前 作者 koroshi 7856 次浏览 最后一次编辑是 8 年前 来自 问答

求教node,写同一个文件会不会产生锁使结果总为最后的数值? 假设我代码是

fs.writeFile "file/sign", 1 , (err)->
  throw err if (err)
fs.writeFile "file/sign", 3 , (err)->
  throw err if (err)
fs.writeFile "file/sign", 5 , (err)->
  throw err if (err)
fs.writeFile "file/sign", 7 , (err)->
  throw err if (err) 

我不同地方触发写不同的数值,最后写到文件里的是不是一定是7,最后一次执行异步写文件?,全部在写同一个文件系统触发顺序就想这样

9 回复

自己尝试了好几下,发现异步写入的时候会发生两种情况, 连续两次写入后面那次写入有小概率丢失,(应该是先执行了写入后面的再执行写入前面的了), 如

fs.writeFile "file/sign", 1 , (err)->
  throw err if (err)
fs.writeFile "file/sign", 3 , (err)->
  throw err if (err)

查看文件结果可能是1 还有就是 当先写入一个很长的字符串,再写入一个比较短的字符串,长字符串不足部分会被保留 比如

fs.writeFile "file/sign", 1234567 , (err)->
  throw err if (err)
fs.writeFile "file/sign", 321 , (err)->
  throw err if (err)

最终会有很大的概率变成 3214567

不知道有没大神解释一下啊原因

首先,大家要求:代码格式化做好,表述清楚一些;然后,个人观点:你的写入明显依赖操作顺序,异步无法确定写入的最后内容~3214567的问题,应该和写入模式有关系,建议查查API

@DevinXian 表示折腾了一下终于会贴代码了,万分感谢,不过还是不知道写入模式是什么意思。我看到以前有个帖子说文件读写不会被锁住的 https://cnodejs.org/topic/530b7a30a5efa4057301ca58 是不是表示遇到这种情况我只能做同步了。 我的需求是大多数情况下数值在内存里做计算的,但是希望他一直把我的值写入文件,然后在程序报错的时候可以载入到值,所以才写异步的写入。

文件写入顺序,和你的逻辑有关系。如果你的逻辑是异步执行的,那么写入顺序就不好预测了。写文件有一个同步的fs.writeFileSync,用这个,只要保证你程序是同步写入的,那么写入顺序就可以控制了。也就是你要求的7

@koroshi

这不是promise吗。。。

串行异步,逻辑上是串行的,但是不会阻塞线程。

@shmnh 嗯这个我知道,但是我怕程序被多访问的时候出现阻塞,因为其实我不关心写入的值,有没有写完,只关心程序执行完后是我最后一次写入的值就可以。 我的程序只在初始化的时候用同步方法读取数据,然后每次操作异步写入数据。

@pynixwang 但是高频率写入的时候出现漏值和错值了啊- -~有什么解决方案嘛

@koroshi 好奇葩的需求。。。。

@pynixwang = =算是研究把,要写个计数的很小很小的东西,存入文件,不崩溃的情况下都不用过文件,所以想到特定方法的时候正常执行逻辑 加一个不管他是否完成的文件写入计算出来的数值

回到顶部