我编写了一个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
我现在搜索了几个小时,但没有找到一个例子,怎么做。当有人能给我一个如何开始的提示时会很好。
谢谢。
答案 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");
}