在多核cpu上使用最大线程

时间:2011-07-10 16:39:32

标签: perl

起初,我的perlskills有限,所以请记住这一点。 ;)

我编写了一个perlscript,用于索引目录并为其中的每个文件执行某些操作。

处理文件需要一些时间。在1到5分钟之间,每个CPU负载接近100%(一个核心)。我的想法是,因为我有一个四核cpu,一次处理多个文件,这导致我进入perl线程。

所以这是我的问题。

1)我的假设是正确的,perl线程是自动分配给多个核心的吗?

2)我发现这个代码示例可以满足我的需求,我想但是我无法弄清楚,如何保持只有8个线程处于活动状态。该示例启动静态计数线程,并在处理它们时完成。但是,在我的情况下,我要处理50个文件,但同时只有8个线程处于活动状态。

所以它应该是这样的: 读取目录,为8个第一个文件启动8个线程,并保持8个线程工作,直到处理完所有文件。

#!/usr/local/roadm/bin/perl
# This is compiled with threading support

use strict;
use warnings;
use threads;
use threads::shared;

print "Starting main program\n";

my @threads;
for ( my $count = 1; $count <= 10; $count++) {
        my $t = threads->new(\&sub1, $count);
        push(@threads,$t);
}   
foreach (@threads) {
        my $num = $_->join;
        print "done with $num\n";
}   
print "End of main program\n";

sub sub1 {
        my $num = shift;
        print "started thread $num\n";
        sleep $num;
        print "done with thread $num\n";
        return $num;
}   

来源:https://wiki.bc.net/atl-conf/pages/viewpage.action?pageId=20548191

我现在搜索了几个小时,但没有找到一个例子,怎么做。当有人能给我一个如何开始的提示时会很好。

谢谢。

4 个答案:

答案 0 :(得分:6)

perl中的线程是重量级的;他们需要时间和CPU来启动和时间,CPU和内存来共享它们之间的数据(并要求你仔细检查你使用哪些模块来保证线程安全)。

你的分叉往往好多了; Parallel::ForkManager让这很容易。

答案 1 :(得分:5)

使用Thread::Queue解决您的问题,并找到工作人员数in this answer

答案 2 :(得分:0)

#!/usr/bin/env perl -w
use strict;
use threads;

my $cpu ||= 5;
my @threads;
my @all_target = qw /1 2 3 4 5 6 7 8 9/;

while(my($t,$job) = each @all_target){
    $t = threads -> create(\&do,$job);
    push @threads,$t;

    if(@threads == $cpu or $t == $#all_target){
        for(@threads){
            $_ -> join();
        }
        @threads = ();
    }
}`enter code here`

sub do{
    my $be_do = shift;
    print"$be_do\n";
    sleep 2;
}

答案 3 :(得分:0)

#!/usr/bin/env perl -w
use strict;
use threads;

my $cpu ||= 5;
my @threads;
my @all_target = qw /1 2 3 4 5 6 7 8 9/;

while(my($t,$job) = each @all_target){

    my $thread = threads -> create(\&do,$job);
    push @threads,$thread;

    if(@threads == $cpu or $t == $#all_target){
        for(@threads){
            $_ -> join();
            print "$_ join\n";
        }
        @threads = ();
    }
}

sub do{
    my $be_do = shift;

    print"$be_do\n";
    sleep 2;
#   $cmd = "do what";
#   system("$cmd");
}