2013-08-21 15 views
13

Come ottenere il numero di CPU o di core in Perl. Voglio questo, per decidere, creando il numero di thread in modo dinamico. Di seguito ho creato 3 thread. Ma voglio creare discussioni basate sul numero di core in quella macchina.Numero di CPU/core in Perl

#!/usr/bin/perl -w 
use threads; 
use Thread::Semaphore; 

my $semaphore = Thread::Semaphore->new();`enter code here` 
my $cur_dir = "D:\\qout"; 
opendir(CURDIR, "$cur_dir"); 
my @file_list : shared = readdir(CURDIR); 
closedir(CURDIR); 


$thr1 = threads->create(\&changemode, \@file_list, "th1"); 
$thr2 = threads->create(\&changemode, \@file_list, "th2"); 
$thr3 = threads->create(\&changemode, \@file_list, "th3"); 

sub &changemode { 

    my ($file_list) = shift; 
    my ($message) = shift; 
    my ($i)   = shift; 
    while (@{$file_list}) { 
     my $fname; 
     $semaphore->down(); 
     if (@{$file_list}) { 
      $fname = shift(@{$file_list}); 
     } 
     $semaphore->up(); 
     print("$message got access of $fname\n"); 
     system ("csh -fc \"chmod +w $fname\""); 
     #sleep (2); 
    } 
} 


$thr1->join(); 

$thr2->join(); 

$thr3->join(); 
+5

A parte: (1) * Sempre * 'usare rigorosamente; usare avvertenze; ​​'. Il modulo 'warnings' è superiore all'interruttore' -w'. (2) Utilizzare un 'Thread :: Queue' invece di proteggere un array con un semaforo. (3) Non puoi dichiarare un sub come "sub & foo {...}". È 'sub foo {...}'. (4) Il '$ fname' può essere' undef'. Non si tiene conto di ciò quando si stampa e si esegue 'csh'. – amon

risposta

13

Partenza moduli CPAN come Sys::Info::Device::CPU

use Sys::Info; 
    use Sys::Info::Constants qw(:device_cpu); 
    my $info = Sys::Info->new; 
    my $cpu = $info->device(CPU => %options); 

    printf "CPU: %s\n", scalar($cpu->identify) || 'N/A'; 
    printf "CPU speed is %s MHz\n", $cpu->speed || 'N/A'; 
    printf "There are %d CPUs\n" , $cpu->count || 1; 
    printf "CPU load: %s\n"  , $cpu->load || 0; 
3

Il getNumCpus metodo di Sys::CpuAffinity lavori su molti sistemi operativi diversi e configurazioni.

6

vecchia questione, ma ecco come lo dico il numero di CPU sul mio server Linux:

#!/usr/bin/perl 
chomp(my $cpu_count = `grep -c -P '^processor\\s+:' /proc/cpuinfo`); 
print("CPUs: $cpu_count\n"); 

Questo funziona solo in linux/Cygwin. Sul lato positivo questa soluzione non ha bisogno di alcun modulo aggiuntivo perl installato.

Edit:
Barak Dagan ha suggerito una soluzione "solo perl" (non ho provato):

open my $handle, "/proc/cpuinfo" or die "Can't open cpuinfo: $!\n"; 
printf "CPUs: %d\n", scalar (map /^processor/, <$handle>) ; 
close $handle; 
2

Un'alternativa per gli utenti di Windows-based che non possono utilizzare Sys :: Info o Sys :: CpuAffinity:

my $numberofcores = $ENV{"NUMBER_OF_PROCESSORS"}; 
0

Questa è una versione stretta che sto usando:

use Path::Tiny; 
sub getProcessors { 
    my @cpuinfo = split "\n", path("/proc/cpuinfo")->slurp_utf8(); 
    return scalar (map /^processor/, @cpuinfo) ; 
} 
0

Sembra $ ENV {} NUMBER_OF_PROCESSORS funziona bene per Windows, ma ero alla ricerca di un Perl one-liner che funziona su Linux e Cygwin troppo, che non richiede eseguibili esterni. Sfortunatamente non ho pacchetti Sys :: * e non riesco a installarli.

Ho iniziato con getconf(1). Ha mostrato le variabili di condizionamento: _NPROCESSORS_CONF e _NPROCESSORS_ONLN. Utilizzando strace(1) su getconf (1) (strace -o s.log getconf -a) si è scoperto che queste informazioni sono estirpate utilizzando il percorso /sys/devices/system/cpu. Questa dir ha cpu[0-9]+ come sub-dirs, il che rende la vita un po 'complicata. Così sono tornato al ben noto /proc/cpuinfo e questo è l'one-liner:

my $cpus = do { local @ARGV='/proc/cpuinfo'; grep /^processor\s+:/, <>;}; 

Forse questo potrebbe essere esteso per ottenere il numero di core on-line, ma è sufficiente per ora.

Problemi correlati