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;