2013-08-21 7 views
13

Cách lấy số CPU hoặc Lõi trong Perl. Tôi muốn điều này, để quyết định, tạo ra số lượng các chủ đề động. Dưới đây tôi đã tạo 3 chủ đề. Nhưng tôi muốn tạo chủ đề dựa trên số lõi trong máy đó.Số CPU/Lõi trong 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

Là một sang một bên: (1) * Luôn luôn * 'sử dụng nghiêm ngặt; sử dụng cảnh báo; Mô-đun 'cảnh báo' vượt trội hơn công tắc' -w'. (2) Sử dụng một 'Thread :: Queue' thay vì bảo vệ một mảng với một semaphore. (3) Bạn không thể khai báo một sub như 'sub & foo {...}'. Đó là 'sub foo {...}'. (4) '$ fname' có thể là' undef'. Bạn không tính đến điều này khi in nó ra và thực thi 'csh'. – amon

Trả lời

13

Kiểm tra các module CPAN như 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

Phương pháp getNumCpus của Sys::CpuAffinity công trình trên nhiều hệ điều hành khác nhau và cấu hình.

6

Cũ câu hỏi nhưng đây là cách tôi nói với số lượng CPU trên máy chủ Linux của tôi:

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

chỉ này hoạt động trong Linux/Cygwin. Về mặt tươi sáng, giải pháp này không cần thêm bất kỳ mô-đun perl nào được cài đặt.

Edit:
Barak Dagan gợi ý "Chỉ perl" giải pháp (tôi đã không kiểm tra nó):

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

Một thay thế cho người dùng cửa sổ dựa trên người không thể sử dụng Sys :: Thông tin hoặc Sys :: CpuAffinity:

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

Đây là một phiên bản chặt chẽ tôi đang sử dụng:

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

Có vẻ như $ ENV {NUMBER_OF_PROCESSORS} hoạt động tốt cho Windows, nhưng tôi đang tìm kiếm một lớp lót Perl hoạt động trên Linux và Cygwin, không gọi các tệp thi hành bên ngoài. Thật không may tôi không có gói Sys :: * và tôi không thể cài đặt chúng.

Tôi bắt đầu với getconf(1). Nó cho thấy biến biến dạng: _NPROCESSORS_CONF_NPROCESSORS_ONLN. Sử dụng strace(1) trên getconf (1) (strace -o s.log getconf -a) nó bật ra rằng những thông tin này được grubbed sử dụng đường dẫn /sys/devices/system/cpu. Thư mục này có cpu[0-9]+ như thư mục con, điều này làm cho cuộc sống trở nên phức tạp hơn một chút. Vì vậy, tôi quay trở lại nổi tiếng /proc/cpuinfo và đây là một trong những-liner:

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

Có lẽ điều này có thể được mở rộng để có được số lượng lõi trực tuyến, nhưng nó là đủ cho bây giờ.