Tengo un programa (Perl) que inicia una gran cantidad de subprocesos (cada uno a cargo de crear gráficos basados en el procesamiento de datos). Cada hilo que comience a usar:Cómo limitar el número máximo de subprocesos paralelos en Perl
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
Los hilos disparan correctamente, pero después de un tiempo, después de que yo he abierto varios de ellos se estrella intérprete de Perl (supongo que tiene que ver con la memoria?). Así que mi solución es limitar el número de hilos que abro a la vez, elegí 15. Y quiero agregar un sub antes de cada línea de creación para verificar si está bien disparar el siguiente hilo o dormir mientras espero para que uno termine Así es como traté de hacerlo.
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;
}
}
}
Así que cada vez que quiero crear un nuevo hilo acabo llamarían
&checkThreads;
Y eso sería tener cuidado para crear un retraso mientras espero a que algunos hilos para limpiar. El problema es que cuando llamo a ese sub, el momento en que golpeó la línea donde puedo comprobar:
$task->is_running()
el programa sale y deja de funcionar sin ningún tipo de error o advertencia. Solo quiero un sub que cuente los hilos de ejecución para limitarlos.
¿Cómo puedo realizar este recuento con éxito?
Otras cosas que he tratado están evaluando la línea siguiente:
scalar(threads->list());
Pero eso me da un valor raro, como si es una referencia sin bendecir Creo que se parece a:
threads=SCALAR(0x80fea8c)
por cierto, eso es (stringification de una) * bendijo * ref – ikegami
muy, muy cierto - tenga en cuenta que los hilos en perl no son como hilos en otros lenguajes de programación - tienen muchos recursos, ya que cada hilo tiene una COPIA de todas las variables.Todavía son útiles en algunos casos, pero en todos los casos en los que tengo que hacer una paralelización, el bifurcado funciona mucho mejor. No está relacionado directamente con tu pregunta, solo quería decírtelo. :) –
¿Qué versión de Perl? ¿Qué versión de hilos? ¿Y sus hilos están desacoplados (tal vez separados en mySubName)? – pilcrow