2013-08-21 4 views
13

Как получить количество процессоров или ядер в Perl. Я хочу это, чтобы решить, создавая число потоков динамически. Ниже я создал 3 потока. Но я хочу создавать потоки, основанные на количестве ядер в этой машине.Число процессоров/ядер в 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

В стороне: (1) * Всегда * 'использовать строгий; использовать предупреждения; '. Модуль 'warnings' превосходит переключатель' -w'. (2) Используйте «Thread :: Queue» вместо защиты массива с помощью семафора. (3) Вы не можете объявить sub как 'sub & foo {...}'. Это 'sub foo {...}'. (4) '$ fname' может быть' undef'. Вы не учитываете это при печати и выполнении 'csh'. – amon

ответ

13

Заканчивать модулей CPAN, таких как 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 метод Sys::CpuAffinity работ на многих различных операционных систем и конфигураций.

6

Старый вопрос, но вот как я говорю количество процессоров на моем Linux-сервер:

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

это работает только в Linux/Cygwin. На яркой стороне это решение не требует дополнительных модулей perl.

Edit:
Barak Даган предложил "только Perl" решение (я не проверял):

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

Альтернативой для пользователей на базе Windows, которые не могут использовать Sys :: Информация или Sys :: CpuAffinity:

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

Это жесткая версия Я использую:

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

кажется $ ENV {NUMBER_OF_PROCESSORS} хорошо работает для Windows, но я искал Perl однострочник, который работает на Linux и Cygwin тоже, что не призывает внешние исполняемые файлы. К сожалению, у меня нет пакетов Sys :: *, и я не могу их установить.

Я начал работу с getconf(1). Он показывает переменные консистентности: _NPROCESSORS_CONF и _NPROCESSORS_ONLN. Используя strace(1) на getconf (1) (strace -o s.log getconf -a), выяснилось, что эта информация обрушивается с использованием пути /sys/devices/system/cpu. Этот каталог имеет cpu[0-9]+, как sub-dirs, что делает жизнь немного сложной. Так что я вернулся к хорошо известному /proc/cpuinfo и это один вкладыш:

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

Может быть, это может быть расширена, чтобы получить количество интернет-ядер, но достаточно для теперь.

Смежные вопросы