-# handle getting needed results
-for my $action (@get_needed) {
-
-}
-# handle parsing needed results
-for my $action (@parse_needed) {
+use threads;
+use Thread::Queue;
+
+for my $state (qw(get parse)) {
+ my %databases;
+ for my $database (keys %{$actions{$state}}) {
+ next unless @{$actions{$state}{$database}};
+ $databases{$database}{queue} = Thread::Queue->new;
+ $databases{$database}{thread} = threads->new(\&handle_action($state,$database,$databases{database}{queue}));
+ $databases{$database}{queue}->enqueue(@{$actions{$state}{$database}});
+ $databases{$database}{queue}->enqueue(undef);
+ }
+ my $ERRORS=0;
+ for my $database (keys %databases) {
+ my ($actioned_keywords,$failed_keywords) = $databases{$database}{thread}->join;
+ if (@{$failed_keywords}) {
+ ADVISE("These keywords failed during '$state' of '$database':",@{$failed_keywords});
+ $ERRORS=1;
+ }
+ @{$state{done_keywords}{$state}{$database}}{@{$actioned_keywords}} = (1) x @{$actioned_keywords};
+ delete @{$state{done_keywords}{$state}{$database}}{@{$failed_keywords}};
+ }
+ save_state(\%state);
+ if ($ERRORS) {
+ WARN("Stoping, as there are errors");
+ exit 1;
+ }