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