in reply to Creating a hash within a fork

Below, am showing a way using MCE::Loop and calling MCE->gather.

#!/usr/bin/perl use warnings; use strict; use POSIX qw(strftime); use Time::Piece; use Cwd qw( abs_path ); use File::Basename; use File::Basename qw( dirname ); use LWP::Simple; use MCE::Loop chunk_size => 1, max_workers => 5; use Date::Calc qw (Delta_Days); use Data::Dumper; my $domains = dirname(abs_path($0)).'/domains.txt'; my $flag = 0; my $date = strftime "%Y-%m-%d", localtime; my %month = ( 'jan'=>'01','feb'=>'02','mar'=>'03','apr'=>'04','may'=>' +05','jun'=>'06','jul'=>'07','aug'=>'08','sep'=>'09','oct'=>'10','nov' +=>'11','dec'=>'12' ); my %domainList = mce_loop_f { # my ($mce, $chunk_ref, $chunk_id) = @_; # $_ is the same as $chunk_ref->[0] for chunk_size => 1 my $domainName = $_; chomp $domainName; print $domainName."\n"; my $expDate = `jwhois -n -h whois.crsnic.net $domainName | grep Ex +piration | awk '{print \$3}'`; print $expDate; my $diff = &dateDiff($expDate); if ($diff < 28 and $diff > 14) { $flag = 1; } elsif ($diff <= 14) { $flag = 2; } MCE->gather($domainName, $diff); } $domains; print Dumper(\%domainList); ...

That enables parallelism and MCE->gather(...) to pass data back to the hash variable residing under the manager process. MCE::Loops (mce_loop_f) opens the $domains file. The 5 workers persist while running (think of a 5 worker pool). Thus, 5 forks, not more.

Replies are listed 'Best First'.
Re^2: Creating a hash within a fork
by marioroy (Prior) on Jun 05, 2015 at 02:43 UTC

    The following does the same thing. Notice the use of MCE::Loop::init for specifying MCE options. One may pass more then 2 arguments to MCE->gather with this demonstration.

    #!/usr/bin/perl use warnings; use strict; use POSIX qw(strftime); use Time::Piece; use Cwd qw( abs_path ); use File::Basename; use File::Basename qw( dirname ); use LWP::Simple; use MCE::Loop; use Date::Calc qw (Delta_Days); use Data::Dumper; my $domains = dirname(abs_path($0)).'/domains.txt'; my $flag = 0; my $date = strftime "%Y-%m-%d", localtime; my %month = ( 'jan'=>'01','feb'=>'02','mar'=>'03','apr'=>'04','may'=>' +05','jun'=>'06','jul'=>'07','aug'=>'08','sep'=>'09','oct'=>'10','nov' +=>'11','dec'=>'12' ); my %domainList; MCE::Loop::init { chunk_size => 1, max_workers => 5, gather => sub { my ($domainName, $diff) = @_; $domainList{ $domainName } = $diff; } }; mce_loop_f { my $domainName = $_; chomp $domainName; print $domainName."\n"; my $expDate = `jwhois -n -h whois.crsnic.net $domainName | grep Ex +piration | awk '{print \$3}'`; print $expDate; my $diff = &dateDiff($expDate); if ($diff < 28 and $diff > 14) { $flag = 1; } elsif ($diff <= 14) { $flag = 2; } MCE->gather($domainName, $diff); } $domains; MCE::Loop::finish; print Dumper(\%domainList); ...

      I like this solution. It was super easy to implement into my code. Thank you so much