Pensaba esta mañana que transformar ese programita en multicore es un ejercicio bastante interesante
use warnings;
use strict;
use Fcntl;
use Time::HiRes qw/time/;
use Parallel::ForkManager;
my $runtime = 5; ## desired runtime, in seconds
my $nprocs = 0;
sub gen_pks {
my ($npks) = @_;
my @pks;
sysopen my $fd, '/dev/urandom', O_RDONLY;
for (1..$npks) {
my $read = sysread $fd, my $buf, 256/8 or die "sysread: $!";
die 'EOF' unless $read;
warn 'short read' if 256/8 != length $buf;
push @pks, $buf
}
close $fd;
return \@pks;
}
sub ncpus {
open my $fd, '<', '/proc/cpuinfo' or die "open: $!";
my $ncpus = grep { /^processor/ } <$fd>;
close $fd;
return $ncpus;
}
my $t0 = time;
my $pm = Parallel::ForkManager->new ($nprocs or ncpus);
$pm->set_waitpid_blocking_sleep (0);
$pm->run_on_finish (sub {
my $data = pop;
printf "%s\n", unpack 'H*', $_ for @$data;
});
while (1) {
last if time-$t0 > $runtime;
$pm->start and next;
$pm->finish (0, gen_pks 1e3);
}
$pm->wait_all_children;
En la línea del "my $runtime" indicamos cuánto tiempo queremos que esto se ejecute. En la siguiente línea indicamos el número de procesos concurrentes que queremos, idealmente el número de cores que tiene la máquina. En sistemas linux se puede dejar a 0 y se detecta solo.
Sorry por ser tan cerrado en estos temas.