我应该如何在Perl中实现原子序列?

Chr*_*s R 6 parallel-processing perl sequences atomic

我有以下要求:

  1. 该序列对于主机是唯一的(不需要共享递增)
  2. 序列必须单调递增.
  3. 序列必须在整个进程中保持不变.
  4. 在多个进程同时处理它的情况下,递增序列必须是原子的.
  5. 大多数情况下,文件将更新,更新后读取新值.但是,也应该可以在不更新的情况下读取当前值.

我可以将perl代码整合在一起,大致可以做到这一点,但我想要一个更优雅的解决方案.

mob*_*mob 5

将序列号存储在文件中,并flock确保只有一个进程可以访问它:

sub set {     # seed the sequence number file
    my ($file, $number) = @_;
    open my $fh, '>', $file;
    print $fh $number;
}  # implicit close

sub get {
    my $file = shift;
    my $incr = @_ ? shift : 1;   # get($f) is like get($f,1)
    open my $lock, '>>', "$file.lock";
    flock $lock, 2;
    open my $fh, '<', $file;
    my $seq = <$fh>;
    close $fh;
    set($file, $seq+$incr) if $incr;   # update sequence number
    close $lock;
    return $seq;
}
Run Code Online (Sandbox Code Playgroud)

您可以将其称为get($file,0)检索序列号而不更改它.