У меня есть программа (Perl ), которая запускает огромное количество потоков (, каждый из которых отвечает за создание графики на основе обработки данных ). Каждый поток, который я начинаю использовать:
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
Потоки запускаются правильно, но через некоторое время, после того как я открыл несколько из них, интерпретатор Perl падает (, я полагаю, это связано с памятью? ). Итак, мое решение состоит в том, чтобы ограничить количество потоков, которые я открываю за раз, я выбрал 15. И я хочу добавить подпрограмму перед каждой строкой создания, чтобы проверить, можно ли запустить следующий поток или выполнить сон, пока я жду чтобы один закончил. Вот как я пытался это сделать.
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;
}
}
}
Поэтому каждый раз, когда я хочу создать новый поток, я просто вызываю
&checkThreads;
И это позаботится о том, чтобы создать задержку, пока я жду очистки некоторых потоков. Проблема в том, что когда я вызываю этот саб, в тот момент, когда я нажимаю на строку, где я проверяю:
$task->is_running()
Программа завершает работу и прекращает работу без каких-либо ошибок или предупреждений. Мне просто нужен сабвуфер, который подсчитывает запущенные потоки, чтобы ограничить их.
Как я могу успешно выполнить этот подсчет?
Другие вещи, которые я пробовал, оценивают следующую строку:
scalar(threads->list());
Но это дает мне странное значение, как будто это неблагословенная ссылка, которая выглядит как:
threads=SCALAR(0x80fea8c)