CNode

多个进程同时写某个文件需要加锁吗?

问答
Hhisune发布于10 年前最后回复10 年前12 回复7795 浏览0 收藏

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)

M
magicdawn#1·10 年前

要锁吧 ...

M
magicdawn#2·10 年前

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

N
Neil-UWA#3·10 年前

用fs.appendFile

L
LeslieYQ#4·10 年前

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

H
hisune#5·10 年前

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

H
hisune#6·10 年前

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

Y
yjhjstz#7·10 年前

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

谢谢 @all

H
hisune#8·10 年前

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

Z
zhangzifa#9·10 年前

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

H
hisune#10·10 年前

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

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

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

H
hisune#12·10 年前

@zhangzifa 多谢

参与回复
登录后即可参与回复。登录