如果我并行运行以下脚本,我可以看到很少有脚本正在等待获取锁定,但有些脚本正在并行运行。 LOCK_EX 未按预期工作。我不明白这里缺少什么。
$|++;
my $lockHandle;
my $file='lock.txt';
#sysopen( $lockHandle, $file, O_RDWR|O_CREAT);
open($lockHandle, '>>', $file);
print "aquiring lock\n";
my $o = flock $lockHandle,LOCK_EX or die "Could not lock '$file' - $!";
print "Locked....$o\n";
## Only executes when the lock is acquired
my $count=5;
my $intex=0;
while ($index <= $count){
print "executing\n";
sleep 1;
$index=$index+1;
}
END {
flock $lockHandle, LOCK_UN;
close $lockHandle;
unlink $file;
}
最佳答案
对于初学者,始终使用 use strict;使用警告;
!它会发现你的问题。
您忘记导入常量 LOCK_EX
和 LOCK_UN
,您可以使用
use Fcntl qw( LOCK_EX LOCK_UN );
(O_RDWR
和 O_CREAT
同样需要从同一模块导入,如果您要使用它们。)
您最终会传递字符串LOCK_EX
或LOCK_UN
,而不是具有这些名称的常量所代表的值。这就是程序因无效参数
而终止的原因。
关于perl - 我如何在 Perl 中聚集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72176576/