use strict;
use warnings;
use Parallel::ForkManager;
$| = 1;
my $MAXIMUM_KIDS_IN_POOL = 3;
my $MAXIMUM_TIME_IN_POOL = 30; # Seconds
my $lifeguard = Parallel::ForkManager->new($MAXIMUM_KIDS_IN_POOL);
my @kids = qw( Ann Bob Cal Dan Eve Fay Gus Hal Ike Joe Kim Lee Meg );
$lifeguard->run_on_start(
sub {
my ($pid, $kid) = @_;
print "\nThe lifeguard waves $kid into the pool\n";
}
);
$lifeguard->run_on_finish(
sub {
my ($pid, $exit_code, $kid) = @_;
print "\n$kid climbs out of the pool\n";
}
);
$lifeguard->run_on_wait(
sub {
print ".";
}, 0.3
);
my $number_of_kids = @kids;
print "\nThere are $number_of_kids kids in line at the pool\n\n@kids\n";
KID_IN_LINE:
for my $kid (@kids) {
my $pid = $lifeguard->start($kid);
next KID_IN_LINE if $pid != 0;
srand();
my $time = int(rand($MAXIMUM_TIME_IN_POOL)) + 1;
print "\n$kid jumps into the pool\n";
sleep $time;
print "\nThe lifeguard orders $kid out of the pool after $time seconds\n";
sleep 0.5;
$lifeguard->finish();
}
print "\nAll the kids have been in the pool\n";
$lifeguard->wait_all_children();
print "\nAll the kids are out of the pool\n";
exit 0;
####
next KID_IN_LINE if $lifeguard->start($kid) != 0;
####
$lifeguard->run_on_start(
sub {
my $kid = pop;
print "\nThe lifeguard waves $kid into the pool\n";
}
);
####
$lifeguard->run_on_finish(
sub {
my $kid = pop;
print "\n$kid climbs out of the pool\n";
}
);