2014-01-15 97 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