在多核cpu上使用最大线程

And*_*ndy 3 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;
}   
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

yst*_*sth 6

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

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


bvr*_*bvr 5

在这个答案中可以找到使用Thread :: Queue和工作人员数量的问题的良好解决方案.