0

我正在使用下面的代码将日志消息写入文本文件,当不同的源并行调用此方法时,程序会挂起。有没有办法在不破坏程序的情况下授予/控制并行写入。

sub sLog {
    my $self = 'currentServerDirectory';
    my $logMsg = "";

    my $fileName = join '_', $self->{LogFilePrefix}, &sTimeStamp("Log");
    my $absFileName = "$self->{LogFolder}/$fileName.txt";

        open APPHDLER, ">>$absFileName" or &exitErr("Cannot append message to file, $absFileName");
        print APPHDLER scalar(localtime(time))." - $logMsg\n";
        close APPHDLER;
}
4

2 回答 2

1

尝试使用flock-- 这是一个简单的示例,您可以尝试了解它的行为:

use strict;
use warnings;
use Fcntl qw/:flock/;

chomp(my $id = `date`);
my $cnt = 0;
while (1) {
    open LOG, ">>shared" or die "Couldn't open shared";
    flock (LOG, LOCK_EX) or die "Couldn't flock";
    print LOG "$id: $cnt\n";
    $cnt++;
    sleep 1;
    close LOG;
}

假设这是保存在flock.pl 中,那么您可以运行flock.pl&以在后台运行一个或多个实例。然后做tail -f shared看看会发生什么。由于您在通过 获取锁和释放锁之间有 1 秒钟的睡眠时间,因此close LOG如果您有一个进程,您将每秒看到一次更新。但是,如果您有 N 个进程,您会看到每个进程都需要 N 秒。

在您现有的示例中,您可以尝试添加use Fcntlandflock行。

于 2018-11-20T04:09:14.803 回答
0

当您打开一个文件进行写入时,该文件的锁定将授予打开它的进程。这样做是为了防止数据因进程相互覆盖而损坏。可能的解决方案是将输出数据提供给处理写入日志文件的单个进程,确保进程在完成写入后关闭文件并释放它们的锁,或者使用为并行设计的库或文件格式文件的访问。这些方法中的前两种对于编写这样的日志文件来说是最简单和首选的。也可能有处理日志文件的 perl 模块(检查 CPAN)。

于 2018-11-19T16:46:59.167 回答