如何在没有冲突的情况下对文件进行并行写入访问?

时间:2012-06-15 12:45:40

标签: perl parallel-processing file-locking

我有一些子进程,应该将一些日志写入公共文件。我想知道这段代码是否有效,以便进程写入公共文件而不会发生冲突:

sub appendLogs {
    open FILE, "+>>", $DMP or die "$!";
    flock FILE, LOCK_EX or die "$!";
    print FILE "xyz\n";
    close FILE;
}

如果没有,你能否给我任何提示,我如何修复或改进它?

3 个答案:

答案 0 :(得分:4)

为了记录目的,我会使用Log4perl而不是重新发明轮子。它支持你正在寻找的东西。

答案 1 :(得分:3)

是的,只要尝试写入文件的每个进程都使用flock,它们就不会发生冲突。

答案 2 :(得分:0)

如果您希望自己的代码是可移植的,那么在锁定文件句柄之后但在写入文件句柄之前,应该寻找文件的末尾。请参阅perldoc -f flock中的“邮箱appender”示例,该示例与您正在执行的操作类似。

sub appendLogs {
    open FILE, "+>>", $DMP or die "$!";
    flock FILE, LOCK_EX or die "$!";
    seek FILE, 0, 2;       # <--- after lock, move cursor to end of file
    print FILE "xyz\n";
    close FILE;
}

seek可能是必要的,因为在您打开文件句柄之后但在获得锁定之前,另一个进程可以附加文件(并移动文件末尾的位置)。