解决Perl中线程的某些核心问题

时间:2015-07-07 06:56:56

标签: multithreading perl

我有40个文件的列表,我想通过我的脚本修改它。 由于每个文件都以相同的方式处理,我想使用Threads来加速它。 因此我有这个结构:

my $threads_ = sub 
{
     while (defined(my $taskRef = $q->dequeue())) 
     {                
         my $work= shift(@{$workRef});
         &{\&{$work}}(@{$workRef});
         my $open= $q->open() - 1;
     }
};

my @Working;
for( my $i = 1; $i < 8; $i++)
{
     push @Working, threads->new($threads_);
}

我有这个代码为每个文件启动一个线程

foreach my $File (@Filelist)
{
    $q->enqueue(['mySub',$FirstVar,$SecondVar]);
}

但它仍然需要很长时间。

我的问题是,是否有某种方法可以将每个线程分配给一个Core,以加快速度?

1 个答案:

答案 0 :(得分:0)

我使用Parallel :: ForkManager这样的事情;它很棒。当存在可接受的标准解决方案时,我建议不要自己酿造。通过&#34;解决某些核心&#34;,我认为你的目的是将并发任务的数量限制为可用处理器的数量,ForkManager将为您执行此操作 - 只需设置最大进程数初始化ForkManager对象。

上述评论者完全正确地指出I / O最终将限制您的吞吐量,但是很容易确定何时添加更多进程无法加快速度。