多个进程同时写某个文件需要加锁吗?
发布于 8 年前 作者 hisune 6606 次浏览 来自 问答

test.js

const fs = require('fs');
var time = (new Date()).getTime();
var write = fs.createWriteStream(__dirname + '/log.log', {flags: 'a'});

for(var i = 0; i < 2000000; i++){
    write.write(time + "\taaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
}

同时执行: node test.js node test.js 2个进程在写,奇怪的是,要过十几秒后,ll查看log.log的大小才会不为0。 并且查看内容看起来并不需要加锁。为什么呢?真的不需要加锁吗?

是一次性写入了整行的内容所以不需要加锁?

12 回复

不过这方面资料好像没有…

用fs.appendFile

一个程序员碰到了一个问题,他决定用多线程来解决。现在两个他问题了有

@Neil-UWA 为啥?这个和writestream.write有什么区别或者好处吗?看了一下官方文档,好像并没有什么特殊说明

@LeslieYQ 能不能不要这么逼?逗

你这测试,2个进程写的东西都没有区分,怎么看结果当然一样了。 另外多进行写文件,是需要加锁的,追加写有时序问题的,也需要加锁。

谢谢 @all

@yjhjstz time不一样啊,与内容无关啊,并且,如果有问题的话\n和\t还有time会在不正常的地方出现啊

追加写没关系的,行不会被破坏,你的需求也就是行不会被其它进程截断吧 @hisune

@zhangzifa 对,如果行的内容足够长的情况也不想他被其他进程截断。但是为什么呢?大神能解释一下吗?

@hisune 最终调用的c函数已经做了保护了。linux/freeBSD下没问题,windows下不是很确定。

回到顶部