【发布时间】:2010-03-02 18:28:44
【问题描述】:
我需要升级一个 Perl CGI 脚本,用户必须完成 3 个步骤。在他们完成每个步骤后,脚本会记录用户完成的步骤。记录这一点很重要,这样我们就可以向用户证明他们只完成了第一步,并没有完成所有三个步骤。
现在,该脚本正在为 CGI 脚本的每个实例创建 1 个日志文件。因此,如果 UserA 执行第 1 步,然后 UserB 执行第 1 步,然后执行第 2 步,然后第 3 步 - 然后 UserA 完成第 2 步和第 3 步,则日志文件的顺序将是。
LogFile.UserA.Step1
LogFile.UserB.Step1
LogFile.UserB.Step2
LogFile.UserB.Step3
LogFile.UserA.Step2
LogFile.UserA.Step3
日志文件以当前时间戳、随机数和进程 PID 命名。
这可以很好地防止同一个文件被多次写入,但目录很快就会获得数千个文件(每个文件只包含几个字节)。有一个过程可以轮换和压缩这些日志,但我不得不这样做,因此脚本每天只记录一个文件,以减少创建的日志文件的数量。
基本上,日志文件的文件名中会包含当前日期,并且每当 CGI 脚本需要写入日志时,它都会附加到当天的一个日志文件中,而不管用户或他们执行的步骤如何正在开启。
不需要读取日志文件 - 唯一会发生的事情是 CGI 脚本的追加。日志轮换将在 7 天或更早的日志文件上运行。
我的问题是,处理并发追加到此日志文件的最佳方法是什么?我需要在追加之前锁定它吗?我在 Perl Monks 上发现 this page 似乎表明“当多个进程正在写入同一个文件,并且所有进程都打开文件进行追加时,不应覆盖数据。”
我了解到,仅仅因为可以做到并不意味着我应该这样做,但在这种情况下,最安全、最佳实践的方法是什么?
总结:
- 并发追加到同一个文件
- 对文件的每次追加只有一行,少于 50 个字符
- 顺序无关紧要
谢谢!
【问题讨论】:
标签: perl concurrency locking