并行处理-我应该如何在Perl中实现原子序列



我有以下要求:

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

我可以破解perl代码,大致可以做到这一点,但我想要一个更优雅的解决方案。

将序列号存储在文件中,并使用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;
}

您可以将其称为get($file,0)来检索序列号,而无需更改它。

系统时间提供了一个单调递增的序列,它处理(2):

perl -MTime::HiRes=time -lwe "print time"

直到有人重置时钟。。。

持久性(3)和增量的原子性(4)似乎需要一个锁定数据库。伯克利DB浮现在脑海中。但你可能正在寻找更简单的东西,除非你已经在使用它了。读取而不更新(5)不会有问题。单调递增序列(2)也不是。

我不知道你说的"主机唯一"one_answers"共享增量"是什么意思(1)。如果来自不同主机的序列元素具有相同的值是可以的,那么您可以将这种方法乘以所有服务器。否则,您只能有一个序列,其他序列必须可以通过网络访问。

最新更新