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

Как насчет [Thread :: Pool] (https://metacpan.org/pod/Thread::Pool) – user1937198

+2

Число потоков, которые могут * действительно работают * параллельно ограничено числом процессоров , Как вы можете ограничить количество потоков, которые вы * создаете * в первую очередь зависит от вашей архитектуры - в модели босса-работника вы просто порождаете * n * работников и назначаете задания через очередь. – amon

+2

@amon, Это верно, только если потоки связаны с процессором. В заблокированном потоке не используется процессор. – 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 Я использую только модуль thread.pm. – waghso

Смежные вопросы