2013-08-21 16 views
13

Jak uzyskać liczbę procesorów lub rdzeni w Perlu. Chcę tego, zdecydować, dynamicznie tworząc liczbę wątków. Poniżej stworzyłem 3 wątki. Ale chcę utworzyć wątki na podstawie liczby rdzeni w tym komputerze.Liczba procesorów/rdzeni w Perlu

#!/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

Odłóż: (1) * Zawsze * "używaj surowych; używaj ostrzeżeń; '. Moduł 'ostrzeżenia' jest lepszy od przełącznika' -w'. (2) Użyj 'Thread :: Queue' zamiast chronić tablicę semaforem. (3) Nie możesz zadeklarować sub-like 'sub & foo {...} '. To jest 'sub foo {...}'. (4) '$ fname' może być' undef'. Nie rozliczasz się z tego przy drukowaniu i wykonywaniu 'csh'. – amon

Odpowiedz

13

Sprawdź CPAN modułów, takich jak 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

getNumCpus metoda Sys::CpuAffinity prac na wielu różnych systemów operacyjnych i konfiguracjach.

6

Stare pytanie, ale tutaj jest jak mówię liczbę procesorów na moim serwerze Linux:

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

Działa to tylko w Linux/Cygwin. Z drugiej strony to rozwiązanie nie wymaga żadnych dodatkowych modułów perl.

Edit:
Barak Dagan zaproponował "tylko perl" rozwiązanie (ja jej nie testowane):

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

Alternatywą dla Windows użytkowników, którzy nie mogą korzystać Sys :: Info lub Sys :: CpuAffinity:

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

jest to mocno wersja używam:

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

Wydaje $ ENV {NUMBER_OF_PROCESSORS} działa dobrze dla Windows, ale ja szukałem Perl jedną wkładką, która działa na Linux i Cygwin też, co nie wymaga wykonywalnych zewnętrznych. Niestety nie mam pakietów Sys :: * i nie mogę ich zainstalować.

Zacząłem od getconf(1). Wyświetla zmienne do kondycji: _NPROCESSORS_CONF i. Używając strace(1) na getconf (1) (strace -o s.log getconf -a) okazało się, że te informacje są wykradzione przy użyciu ścieżki /sys/devices/system/cpu. Ten katalog ma cpu[0-9]+ jak subdirs, co sprawia, że ​​życie jest nieco skomplikowane. Więc wróciłem do znanego /proc/cpuinfo i jest to jedno-liner:

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

Może ten może zostać przedłużony, aby uzyskać liczbę rdzeni online, ale to wystarczy na razie.