2013-08-21 20 views
13

PerlでCPUまたはコアの数を取得する方法。私はこれを決定し、スレッドの数を動的に作成します。私は3つのスレッドを作成しました。しかし、私はそのマシンのコアの数に基づいてスレッドを作成したいと思います。PerlのCPU /コアの数

#!/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&foo {...}'のようなサブを宣言することはできません。これは 'sub foo {...}'です。 (4) '$ fname'は' undef'です。これを印刷して 'csh'を実行するときは、これを考慮しません。 – amon

答えて

13

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

としてCPANモジュールの多くの異なるオペレーティングシステムや構成上のSys::CpuAffinity作品のgetNumCpus方法をチェックしてください。

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

のLinux/cygwinの中にこれだけ作品:

6

古い質問が、ここでは、私は私のLinuxサーバ上のCPUの数を伝える方法です。明るい側では、このソリューションは余分なperlモジュールをインストールする必要はありません。

編集:
バラクダガンは "Perlののみ" のソリューションを(私はそれをテストしていない)提案:

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

のSys ::情報を使用することはできませんWindowsベースのユーザーのための代替またはの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用うまく動作ようだが、私は外部の実行可能ファイルを呼び出すことはありません。これは、あまりにもLinuxやCygwinの上で動作するPerlのワンライナーを探していました。残念ながら私はSys :: *パッケージを持っていないのでインストールできません。

私はgetconf(1)で始まりました。設定変数には_NPROCESSORS_CONF_NPROCESSORS_ONLNのショーがあります。 getconf(1)(strace -o s.log getconf -a)にstrace(1)を使用すると、これらの情報は/sys/devices/system/cpuパスを使用して解決されていることが判明しました。このディレクトリにはサブディレクトリのようなcpu[0-9]+があり、人生は少し複雑になります。だから私はよく知られて/proc/cpuinfoに戻り、これはワンライナーです:

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

多分これは、オンラインのコアの数を取得するように拡張することができ、それが今では十分です。

関連する問題