perl - 通过锁定文件来同步进程

标签 perl

我的一个脚本正在安装一个组件。并行运行时,相同的脚本会尝试安装相同的组件,因此我考虑通过在安装脚本时锁定文件来同步进程,并在其他脚本安装某些内容时等待。

代码如下所示:

# this will create a file handler on a file from TEMP dir with the
# name of the component; if it doesn't exist in TEMP dir, it will create it

my $file = $ENV{"TEMP"}. "\\" . $componentName;
open (my $fh, ">", "$file") or die "Couldn't open file!";

# this will apply an exclusive lock  meaning that if another process
# already locked the file, it will wait until the lock is removed

flock($fh, 2) or die "Failed to lock the file";

# install the component..

# closing the file handle automatically removes the lock
close $fh;

我担心当脚本锁定文件并开始安装时第二个脚本出现并尝试在锁定文件上创建文件句柄时的情况。我没有看到任何错误,但我不想错过任何东西。

这样会有问题吗?

最佳答案

重要的是要记住 - “打开”在任何一种情况下都有效,因为这不会测试锁。 flock 操作将阻塞,直到锁被释放。

这应该可以正常工作,尽管一旦锁定被释放 - 您可能想检查是否仍然需要运行安装,除非您真的不关心执行两次 -例如如果脚本的其余部分使用/依赖它。

此外 - 是否有其他不是您的脚本的“安装”来源可能会导致相同的问题?锁是一个咨询性的东西。

这将是您程序的风格改进:

  • 测试$ENV{'TEMP'}以查看它是否存在,如果不存在则默认(或失败)。
  • 使用 Fcntl qw ( :flock ); 因为这样您就可以 flock ( $fh, LOCK_EX ); 来明确您正在获取独占锁。
  • 您似乎使用 \\ 作为文件分隔符。如果您使用类似 File::Spec 的内容可能会更好出于可移植性的原因,这样做。
  • 您可以使用 LOCK_NB 实现非阻塞:flock ( $fh, LOCK_EX | LOCK_NB ),然后在锁定时跳过。

关于perl - 通过锁定文件来同步进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872872/

相关文章:

html - 使用 HTML::Template 的控制逻辑

perl - 如何确定 Perl 函数在运行时是否存在?

perl - 如何在 Perl Smart::Comment 上调用函数?

windows - Windows 10 上的 "/bin/sh: C:Perl64binperl.exe: command not found"

perl - Perl 脚本中的 SQL*Plus

perl - Perl 6 有污点模式吗?

perl - 如何为 Hypnotoad 打开套接字

perl - Mac M1 Homebrew Perl Carton Net::SSLeay 正在以不安全的方式加载 libcrypto

perl - 在 Vim 中,如何避免将 "/*"视为注释

perl - 为什么在Perl中进行字符串插值时,变量名后跟下划线的值不能正确评估?