Ho un programma (Perl) che prende il via una quantità enorme di fili (ognuno incaricato di creare grafica basata sul trattamento dei dati). Ogni thread comincio utilizzando:Come limitare il numero massimo di thread paralleli in perl
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
I fili fuoco spento correttamente, ma dopo un po ', dopo aver aperto alcuni di loro crash dell'interprete Perl (suppongo che è legato alla memoria?). Quindi la mia soluzione è quella di limitare il numero di thread apro alla volta, ho preso 15. E voglio aggiungere un sub prima di ogni linea di creare per controllare se è ok per sparare il filo successivo o eseguire un sonno mentre aspetto per uno per finire. Questo è il modo in cui ho provato a farlo.
sub checkThreads{
my $addThread = 0;
until($addThread){
my $totalThreads = 0;
foreach my $task (@threads){
if($task->is_running()){$totalThreads++;}
}
if($totalThreads <= 15){
print "Ok to add new thread, carry on!\n";
$addthread = 1;
}else{
print "Waiting for $totalThreads threads to fire next one...\n";
sleep 2;
}
}
}
Così ogni volta che voglio creare un nuovo thread vorrei solo richiamare
&checkThreads;
E che si sarebbe preso cura di creare un ritardo mentre aspetto che alcuni fili per ripulire. Il problema è che quando chiamo che sub, il momento in cui mi ha colpito la linea dove verifico:
$task->is_running()
il programma termina e smette di funzionare senza alcun errore o avviso. Voglio solo un sub che conti i thread in esecuzione per limitarli.
Come posso eseguire questo conteggio con successo?
Altre cose che ho provato stanno valutando la seguente riga:
scalar(threads->list());
ma che mi dà un valore di strano, come si tratta di un riferimento unblessed Credo che assomiglia:
threads=SCALAR(0x80fea8c)
btw, che è (in stringa di a) * benedetta * ref – ikegami
molto, molto BTW - fare tenere a mente che le discussioni in perl non sono come le discussioni in altri linguaggi di programmazione - sono molto affamato di risorse, dal momento che ogni thread dispone di una copia di tutte le variabili.Sono ancora utili in alcuni casi, ma in tutti i casi in cui devo fare la paralellizzazione, la forking funziona molto meglio. Non è collegato direttamente alla tua domanda, volevo solo dirti questo. :) –
Quale versione di Perl? Quale versione dei thread? E i tuoi thread sono distaccati (forse il self-detaching in mySubName)? – pilcrow