Как ограничить максимальное количество параллельных потоков в Perl

У меня есть программа (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)
7
задан gorba 21 July 2012 в 23:00
поделиться