2013-09-15 2 views
0

У меня есть многопоточный основной скрипт Perl. Я хочу, чтобы каждый поток имел три команды для запуска, как только весь поток будет завершен, я хочу, чтобы мой скрипт снова запускал тот же поток, в основном в цикле, может кто-нибудь дать мне знать, как это сделать?как запустить поток Perl для цикла

это мой Perl фрагмент кода

my @finalOneClickarray= grep(/\S/, @oneclickConcurrentbackup); #----Removing the empty content from the array---# 

#---Making Concurrent OneClick backup commands using threads------# 
my @threads; 

#-----performing the CHO loops as given by user-------# 
foreach (@finalOneClickarray) { 
    push @threads, threads->new(\&concurrentBackupCommandsRead, $_); 
} 

foreach (@threads) { 
    $_->join(); 
} 

concurrentBackupCommandsRead является способ, в котором команды получают казнены.

Обновленный код Perl: -

use threads; 
use threads::shared; 
my @arr = (1,2,3,4); 
my $outnumber :shared =4; 


print "\n variable outside thread that is in main program $outnumber\n"; 
my @threads; 


for($i=0;$i<=3; $i++) 
{ 
    print "\ncalling subrountine vinay for $i times\n"; 

    vinay(); 

} 

sub vinay() 
{ 
    foreach (@arr) { 
     push @threads, threads->create(\&doSomething); 
    } 
    foreach (@threads) { 
     $_->join(); 
    } 
} 

sub doSomething() 
{ 

print "\n Before increment is $outnumber\n"; 
my $foo = $outnumber; 
$outnumber = $foo + 1; 

print "\n After increment is $outnumber\n"; 

} 
+0

Вы пытаетесь распределить рабочую нагрузку между фиксированным числом потоков? Если это так, используйте Thread :: Queue для передачи задач рабочим. – amon

+0

ни одна нить не выполнит sub rountine и вернется к основному скрипту perl, теперь, когда он вернулся к основному скрипту, я хочу снова запустить тот же набор команд, поэтому это должно продолжаться в цикле, поэтому хотелось спросить, как чтобы поставить вышеуказанный код в цикл, если есть какой-либо способ, пожалуйста, дайте мне знать –

+1

@VinayD, непонятно, что вы просите. Учитывая ваш комментарий, почему вы не можете просто поставить вышеуказанный код в подпрограмму и вызывать * это * в цикле? Покажите нам, что вы пробовали, и почему/где это не работает. – pilcrow

ответ

1

На вашем втором прогоне через петлю, вы пытаетесь присоединиться к уже присоединился нить (потому что вы только когда-либо добавить к @threads). Это вызывает ошибку: «Thread уже присоединился».

Очистить @threads или локализовать его до vinay(), напр.

sub vinay() 
{ 
    my @threads; 
    foreach (@arr) { 
     push @threads, threads->create(\&doSomething); 
    } 
    foreach (@threads) { 
     $_->join(); 
    } 
} 
+0

Спасибо за ответ, в этом случае у меня есть вопрос, что во второй раз потоки, которые возникают, будут начаты там, только после того, как потоки, которые были порождены в первом петля завершена или даже до того, как они завершатся, и ее порождение. –

+0

Я не уверен, что я понимаю ваш вопрос. Если вы спрашиваете, будет ли вторая группа потоков работать после завершения первой группы, ответ будет да. (Потому что ваш код навязывает это поведение, ожидая их возврата) – Hasturkun

+0

oh ok thats, что я спрашивал, мне нужна моя первая группа потоков для завершения, а затем нужно создать только вторую группу потоков, спасибо за вашу помощь .. –

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