【问题标题】:How do I give parallel write access to a file without collisions?如何在没有冲突的情况下为文件提供并行写入访问权限?
【发布时间】:2012-06-15 12:45:39
【问题描述】:

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

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

如果没有,您能否给我一些提示,我该如何解决或改进它?

【问题讨论】:

    标签: perl parallel-processing file-locking


    【解决方案1】:

    出于记录目的,我会使用Log4perl 而不是重新发明轮子。它支持您正在查找的内容。

    【讨论】:

    • 非常感谢您的反馈!!好吧..虽然我已经写过,但我需要一个日志记录算法,我...并不是真的要记录日志...我必须保存 xml 文件的某些部分...
    【解决方案2】:

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

    【讨论】:

    • 但是如果我无法获得成功flock,我需要在没有选项的情况下写入文件怎么办?您的解决方案对于关键应用来说不够好。
    • @Ωmega 您不会写入“关键应用程序”中的单点故障。这个问题是关于日志的。
    【解决方案3】:

    如果您希望您的代码具有可移植性,您应该在锁定文件句柄之后但在写入文件之前查找文件末尾。请参阅perldoc -f flock 中的“邮箱附加程序”示例,这与您正在执行的操作类似。

    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 可能是必需的,因为在您打开文件句柄之后但在您获取锁之前,另一个进程可能会附加文件(并移动文件末尾的位置)。

    【讨论】:

    • 在 linux(或一般的 POSIX?)上,seek 是不必要的。 "如果文件是用O_APPEND打开(2)的,文件偏移量在写入前首先设置为文件末尾。文件偏移量的调整和写入操作作为原子步骤执行。"
    • @ikegami - 很公平。我重写了我的第一句话。
    • 如果在flock 呼叫失败后死亡不是一种选择?
    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多