2012-04-19 50 views
4

如果我有4个,8个或更多的线程&群集在运行此代码的一个框中,是否可以在日志文件/文件编写器上存在资源争用?如果是这样,你能发表一个例子来说明吗?到目前为止,我所做的所有测试似乎都表明写入数据不会被交织在一起,并且不会被丢弃,但我不是100%确信的在Node.js中记录文件:集群安全吗?

谢谢!

var errLog = fs.createWriteStream(... + '/error.log'); 
GLOBAL.dbLog = fs.createWriteStream(... + '/db.log'); 
+0

您是否使用大于平台“PIPE_BUF”限制大小的块进行任何测试? (我系统上的'/ usr/include/linux/limits.h'定义'PIPE_BUF'为'4096'字节。你的平台可能不同。) – sarnold 2012-04-19 22:25:31

+0

我没有。你是说这可能会影响事物吗?如果是这样,解决方案是什么? – ControlAltDel 2012-04-19 22:26:54

+0

我怀疑它可能会影响结果,但这只是一个怀疑。 – sarnold 2012-04-19 22:27:37

回答

4

没有线程或聚集过程的协调,所以这个问题归结为OS是否将允许多个开放流写入到文件中。 CreateWriteStream的默认C标志是O_WRONLY || O_CREAT || O_TRUNC。这表示第一个问题 - 所有进程将创建一个新的截断文件(可能需要附加时)。

因此,假设您正在创建的流时指定w+作为一个标志...

对于Linux,this related question表明您都会好的,只要字节数小于PIPE_BUF字节(4096在Linux上,其他一些Unix上的512)。

我不确定Windows上的答案是什么。

+0

如何在创建流时指定w +?我打电话fs.createWriteStream(路径,[选项])这是一个可能的选择?它未在文档中列出。另外,有没有办法改变我的系统上的PIPE_BUF?我正在使用3种不同的unix版本 - macOS,centOS和ubuntu – ControlAltDel 2012-04-24 19:49:21

+0

[docs](http://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options)显示了使用'w'的示例。你可以用'w +'替换它。编辑Linux源代码和重新编译,我不相信有一种方法来改变PIPE_BUF(这是一个编译常量) – 2012-04-25 14:22:52

+0

非常感谢! – ControlAltDel 2012-04-25 15:05:08