Могу ли я полагаться на DB_File для синхронизации доступа / обновлений из нескольких одновременных сценариев perl? - PullRequest
0 голосов
/ 16 декабря 2011

Я пишу Perl-скрипт, который будет запускаться одновременно N раз. Скрипт должен будет обработать список. Каждый элемент списка необходимо обработать только один раз.

Могу ли я положиться на DB_File, чтобы отметить, какой элемент обрабатывается / обрабатывается? Я могу сделать из списка хеш, который будет удален в файл.

Если нет, как лучше всего это реализовать?

1 Ответ

0 голосов
/ 16 декабря 2011

Вместо использования 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;
}
...