我可以依靠DB_File来同步来自多个同时perl脚本的访问/更新吗?

时间:2011-12-16 16:53:37

标签: perl berkeley-db

我正在编写一个同时运行N次的Perl脚本。该脚本需要处理一个列表。列表中的每个元素只需处理一次。

我可以依靠DB_File来标记处理/处理哪个元素吗?我可以从列表中删除将被删除的文件。

如果没有,实现这个的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

为什么不使用类似的东西,而不是使用Berkeley DB Parallel::Fork::BossWorker?我已经愉快地使用它好几年来做你正在描述的事情了。

<强>更新

Berkeley DB本身没有任何问题,但令我感到震惊的是你需要编写一堆队列管理代码,而像BossWorker这样的模块会为你解决所有问题(让你专注于真正的问题)。

作为一个例子,我使用它来监视网络交换机,其中连续检查它们需要太长时间(特别是如果一个或多个交换机有问题)并且并行检查它们会占用监控盒。精简版看起来像:

use strict;
use warnings;
use Parallel::Fork::BossWorker;

my %opts         = get_options();
my %config       = read_config_file($opts{config});
my $worker_count = $opts{POLLING_WORKER_PROCESSES} || 3;
my @results;
# Other setup/initialization stuff... yada, yada, yada

# Set up the BossWorker
my $bw = new Parallel::Fork::BossWorker(
    work_handler   => \&do_work,
    result_handler => \&check_result,
    worker_count   => $worker_count,
    );

# Populate the work queue
foreach my $switch (@switches) {
    $bw->add_work({switch => $switch, config => \%config, opts => \%opts });
}

# Process the work in the queue
$bw->process();

# Once the workers are done, do something with the results

exit;

########################################################################
sub check_result {
    my $result = shift;
    if ($result) {
        push @results, $result;
    }
}

sub do_work {
    my $work   = shift;
    my $switch = $work->{switch};
    my %config = %{$work->{config}};
    my %opts   = %{$work->{opts}};
    my $result = '';

    # Do something...

    return $result;
}