Могу ли я полагаться на DB_File для синхронизации доступа / обновлений из нескольких одновременных сценариев perl?
Я пишу Perl-скрипт, который будет работать одновременно N раз. Скрипт должен будет обработать список. Каждый элемент списка должен быть обработан только один раз.
Могу ли я положиться на DB_File, чтобы отметить, какой элемент обрабатывается / обрабатывается? Я могу сделать хеш из списка, который будет удален в файл.
Если нет, каков наилучший способ реализовать это?
1 ответ
Вместо того, чтобы использовать 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;
}