grasshopper!!! has asked for the wisdom of the Perl Monks concerning the following question:

Can anyone tell me why the last child process will not exit.The program tries to calculate PI using children to split progress and sum the answers at end,but will not return last calculation and exit.

#!/usr/bin/perl -w use feature 'say'; use IO::Handle; my $total=0.0; @waitlist = qw(0 200 400 600 800 1000); foreach $item (@waitlist) { pipe(*{$item},RETHAND); *{$item}->autoflush(1); RETHAND->autoflush(1); unless (my $pid = fork()) { my $h = 1.0 /1200.0; my $sum = 0.0; for (my $i = $item; $i < ($item+200); $i++){ my $x = $h * ($i - 0.5); $sum += 4.0 / (1.0 + $x*$x); } my $ret=$sum*$h; print RETHAND "$ret"; exit; } } foreach $item (@waitlist) { $response = <$item>; $total+= ($response+0.0); print "$total\n"; } 1 while (wait() != -1); print " $total\n"; print "All done!\n";

Replies are listed 'Best First'.
Re: Trouble with child processes
by Anonymous Monk on Nov 29, 2015 at 01:00 UTC

    Much easier as "forked open"

    #!/usr/bin/perl # http://perlmonks.org/?node_id=1148787 use strict; use warnings; my $total = 0.0; my @waitlist = qw(0 200 400 800 1000); my @fhs; foreach my $item (@waitlist) { if( open my $fh, '-|' ) { push @fhs, $fh; } else { my $h = 1.0 / 1200.0; my $sum = 0.0; for my $i ($item .. $item + 200 ) { my $x = $h * ($i - 0.5); $sum += 4.0 / (1.0 + $x*$x); } my $ret=$sum * $h; print $ret; #warn "$item exiting\n"; exit; } } for my $fh ( @fhs ) { $total += (<$fh> + 0.0); print "$total\n"; close $fh; } print " $total\n"; print "All done!\n";
Re: Trouble with child processes
by FreeBeerReekingMonk (Deacon) on Nov 29, 2015 at 02:05 UTC

    ninja'd...nevermind

    #!/usr/bin/perl -w use feature 'say'; use IO::Handle; my $total=0.0; @waitlist = qw(0 200 400 800 1000); foreach $item (@waitlist) { pipe(*{$item},RETHAND); *{$item}->autoflush(1); RETHAND->autoflush(1); unless (my $pid = fork()) { my $h = 1.0 /1200.0; my $sum = 0.0; for (my $i = $item; $i < ($item+200); $i++){ my $x = $h * ($i - 0.5); $sum += 4.0 / (1.0 + $x*$x); } my $ret=$sum*$h; print RETHAND "$ret"; exit; }else{ close RETHAND } } foreach $item (@waitlist) { $response = <$item>; $total+= ($response+0.0); print "$total\n"; } 1 while (wait() != -1); print " $total\n"; print "All done!\n";
Re: Trouble with child processes
by Anonymous Monk on Nov 29, 2015 at 01:34 UTC
    Thats because you have to close RETHAND in the parent process. Also, I've always wanted to ask one of you guys... why do you indent your code so creatively???
      why do you indent your code so creatively???

      Right back atchya!

      #!/usr/bin/perl # http://perlmonks.org/?node_id=1148787 use strict; use warnings; my $total = 0.0; my @waitlist = qw(0 200 400 800 1000); my @fhs; foreach my $item (@waitlist) { if( open my $fh, '-|' ) { push @fhs, $fh; } else { my $h = 1.0 / 1200.0; my $sum = 0.0; for my $i ($item .. $item + 200 ) { my $x = $h * ($i - 0.5); $sum += 4.0 / (1.0 + $x*$x); } my $ret=$sum * $h; print $ret; #warn "$item exiting\n"; exit; } } for my $fh ( @fhs ) { $total += (<$fh> + 0.0); print "$total\n"; close $fh; } print " $total\n"; print "All done!\n";

      Much nicer! :)


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Indeed, much better, I also prefer The One True Way (aka perltidy's default settings). BTW, that was a different anonymonk :)