karls-mac-mini:monks karl$ ./buks_patch.pl 0.01
processes: 4
fork: 13.8262140750885
karls-mac-mini:monks karl$ ./buks_patch.pl 0.25
processes: 4
fork: 13.9020979404449
karls-mac-mini:monks karl$ ./buks_patch.pl 0.5
processes: 4
fork: 15.0743520259857
karls-mac-mini:monks karl$ ./buks_patch.pl 1.0
processes: 4
fork: 20.0701560974121
####
#!/usr/bin/env perl
use strict;
use warnings;
use Math::BigInt;
use Parallel::ForkManager;
use Time::HiRes qw ( time );
use feature qw(say);
my $sleep_period = shift;
my $processes = qx(sysctl -n hw.ncpu);
chomp $processes;
my $pm = Parallel::ForkManager->new($processes);
$pm->set_waitpid_blocking_sleep($sleep_period);
say qq(processes: $processes);
my $start = time;
for my $number ( 1 .. 50 ) {
$pm->start($number) and next;
my $factorial = Math::BigInt->bfac(2000) for 1 .. 10;
$pm->finish(0);
}
$pm->wait_all_children;
say qq(fork: ), time - $start;
####
sub _waitpid_blocking {
my $self = shift;
# pseudo-blocking
if( my $sleep_period = $self->{waitpid_blocking_sleep} ) {
while() {
my $pid = $self->_waitpid_non_blocking;
return $pid if $pid;
# sleep $sleep_period;
select( '','','', $sleep_period );
}
}
return waitpid -1, 0;
}