2014-01-15 39 views
2

考虑我有大约100个子程序,我必须使用线程运行。
如何限制所有线程,以便一次只能运行10个线程?你可以给我一个示例代码。
下面是示例代码,我需要实现它限制一次运行的线程号

use threads; 

my ($thr1) = threads->create(\&sub1,$parameter); 
my ($thr2) = threads->create(\&sub2,$parameter); 
... 
my ($thr100) = threads->create(\&sub100,$parameter); 

my $result; 
for my $t(@threads){ 
    #print "$t\n"; 
    (my @getit)= $t->join(); 
    my $tmp = join '', @getit; 
    $result .= $tmp; 

} 
print "$result\n"; 

或做你有这方面的任何其他方法。每个子例程将执行不同的任务。

+0

如何[主题::池(https://metacpan.org/pod/Thread::Pool) – user1937198

+2

可*真正办成*并行线程的数量是由处理器的数量限制。如何限制首次创建的线程数量取决于您的架构 - 在老板模型中,您只需生成* n *个工作人员并通过队列分配工作。 – amon

+2

@amon,只有在线程受CPU限制的情况下才会如此。阻塞的线程不使用CPU。 – ikegami

回答

3
use threads; 
use Thread::Queue 3.01 qw(); 

my $NUM_WORKERS = 10; 

sub worker { 
    my ($job) = @_; 
    my ($sub_name, @args) = @$job; 
    my $sub_ref = \&$sub_name; 
    $sub_ref->(@args); 
} 

{ 
    my $q = Thread::Queue->new(); 

    my @workers; 
    for (1..$NUM_WORKERS) { 
     push @workers, async { 
     while (my $job = $q->dequeue()) { 
      worker($job); 
     } 
     }; 
    } 

    $q->enqueue($_) 
     for 
     [ sub1 => (@args) ], 
     [ sub2 => (@args) ]; 

    $q->end(); 
    $_->join() for @workers; 
} 
+0

您在这里使用了1个子程序。你能否提供多个子程序的样本?是否可以使用{{100个作业列表}来调用多个子程序? – waghso

+0

我对他使用的模块一无所知,但很明显,您只需通过调用'$ q-> enqueue($ some_job)'来添加不同的作业。但你肯定应该在使用它之前阅读模块...反正 – DeVadder

+0

@DeVadder我只在这里使用threads.pm模块。 – waghso