shanu_040 has asked for the wisdom of the Perl Monks concerning the following question:
$results = SOAP::Lite -> uri($PARASEARCH_CLIENT_URI) -> proxy($PARASEARCH_CLIENT_PROXY, timeout => $PARASEARCH_PARA +LLEL_TIMEOUT + 15) -> parallel_search($serialized_searches, $search_string, $max_ +hits, $res_man->site_modules) -> result; };
sub parallel_search { my ($self, $serialized_searches, $rawsearch, $max_hits, $site_modu +les) = @_; my (%return, $result_set); my $obj = Data::Serializer->new( serializer => 'Storable', portable => '1', encoding => 'b64', ); my $searches = $obj->deserialize($serialized_searches); my $t0 = [gettimeofday]; my $pm = new Parallel::ForkManager($PARASEARCH_MAX_PROCESSES); $pm->run_on_start(sub { my ($pid,$ident)=@_; }); $pm->run_on_wait(sub { my ($pid, $ident) = @_; my $elapsed = tv_interval ( $t0, [gettimeofday]); my $remaining = scalar(keys %{$pm->{processes}}); #print "$$ waiting ... $elapsed\n"; #print STDERR " -- remaining $remaining\n"; #print STDERR "processes " . $pm->{processes} . "\n"; if ($elapsed > $PARASEARCH_PARALLEL_TIMEOUT) { # print STDERR "timeout exceeded $remaining processes +remain\n"; foreach my $process (keys %{$pm->{processes}}) { # print STDERR " .. $process\n"; kill 'TERM' => $process; } } }, 0.5 ); $pm->run_on_finish(sub { my ($pid, $exit_code, $ident) = @_; # print STDERR "database $ident done = exit $exit_code \n"; }); foreach my $key (keys %$searches) { my $pid = $pm->start($key) and next; if (-e $site_modules) { my @orig_inc = @INC; unshift (@INC, $site_modules); eval 'require ' . ref($$searches{$key}) . ';'; @INC = @orig_inc; } else { eval 'require ' . ref($$searches{$key}) . ';'; } if ($@) { print "error $@\n"; } my ($parsed_search, $result_set); eval { $parsed_search = $$searches{$key}->parse_search(); }; if ($@) { print STDERR "error parsing search: $@"; $result_set = new DBWIZ::Search::ResultSet; $result_set->status($@); $result_set->hits(-6); }else{ eval { $$searches{$key}->max_hits($max_hits); $result_set = $$searches{$key}->get_search_results($pa +rsed_search, $key); }; if ($@) { print STDERR "bad eval resource [$key]: $@ \n"; $result_set = new DBWIZ::Search::ResultSet; $result_set->status($@); $result_set->hits(-3); } } $result_set->rawsearch($rawsearch); eval { $obj->store($result_set, $PARASEARCH_SHARED_MEM . getppid +. escape($key)); }; if ($@) { print STDERR "from eval: $@ \n"; $result_set = new DBWIZ::Search::ResultSet; $result_set->status($@); $result_set->hits(-11); } $pm->finish; } $pm->wait_all_children; eval { foreach my $key (keys %$searches) { my $filename = $PARASEARCH_SHARED_MEM . $$ . escape($key); my $result_set; if (-e $filename) { $result_set = $obj->retrieve($filename); unlink($filename); } else { # need a new $timeout_result object every loop my $timeout_result = new DBWIZ::Search::ResultSet; $timeout_result->status('timeout'); $timeout_result->hits(-5); $result_set = $timeout_result; } $return{$key} = $result_set; } }; if ($@) { print STDERR "Problem with search module: $@\n"; } my $temp = $obj->serialize(\%return); return($temp); }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Running a Perl Code in different Processes
by Anonymous Monk on Oct 15, 2008 at 08:42 UTC | |
by Anonymous Monk on Oct 15, 2008 at 11:07 UTC | |
|
Re: Running a Perl Code in different Processes
by cdarke (Prior) on Oct 15, 2008 at 10:02 UTC |