У меня очень большой хэш-хэш с более чем 50 000 записей. Я хочу обработать это многопоточное из-за временных ограничений.
Возможно ли для каждого вызова dequeue () возвращать следующий элемент из хеша, а не полный хеш? В приведенном ниже примере я хочу, чтобы dequeue () возвращала просто:
flintstones => {
old_address => "0x1231234a",
new_address => "0x1234234d",
source => "sym"
},
Затем я могу обработать это в моем потоке, пока другой поток удаляет другой элемент из хэша, пока не будут обработаны все элементы. Мой пример кода ниже.
Если мне нужно изменить формат хранилища (HoH), это не проблема. Возможно, будет работать массив хэшей? Любая помощь / указатель приветствуется.
use strict;
use warnings;
use threads;
use Thread::Queue;
use Data::Dumper;
my %hoh = (
flintstones => {
old_address => "0x1231234a",
new_address => "0x1234234d",
source => "sym"
},
jetsons => {
old_address => "0x12712343",
new_address => "0x12142344",
source => "sym"
},
simpsons => {
old_address => "0x12f12347",
new_address => "0x12a42348",
source => "dwarf"
},
);
my $href = \%hoh;
my $queue= Thread::Queue->new($href);
my $t = threads->create('start_sub');
my $result = $t->join;
sub start_sub {
print "items on queue = " . $queue->pending() . "\n";
while( $queue->pending() ) {
my $item = $queue->dequeue_nb();
#
## dequeue_nb returns undef when queue empty
if( $item ) {
print "Doing work in thread " . threads->tid() . " on:\n";
print Dumper($item);
print "Done =====================\n"
}
}
}