Mam program (Perl), który uruchamia ogromną ilość wątków (każdy odpowiedzialny za tworzenie grafiki w oparciu o przetwarzanie danych). Każdy wątek zacząć używać:Jak ograniczyć maksymalną liczbę równoległych wątków w perlu
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
Nitki wystrzelić poprawnie, ale po jakimś czasie, gdy mam otwarte kilka z nich ulega awarii Perl interpreter (zakładam, że jest związany z pamięci?). Więc moim rozwiązaniem jest ograniczenie liczby wątków, które otwieram na raz, wybrałem 15. I chcę dodać sub przed każdą linią utwórz, aby sprawdzić, czy można wystrzelić kolejny wątek lub wykonać uśpienie podczas oczekiwania dla jednego do końca. Tak właśnie próbowałem to zrobić.
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;
}
}
}
Więc za każdym razem Chcę utworzyć nowy wątek chciałbym po prostu zadzwoń
&checkThreads;
A to zadbać, aby tworzyć opóźnienie podczas czekam na niektóre wątki, aby oczyścić. Problemem jest to, że gdy zgłoszę że sub moment uderzę linię gdzie mogę sprawdzić:
$task->is_running()
program wychodzi i przestanie działać bez jakiegokolwiek błędu lub ostrzeżenia. Chcę tylko sub, który liczy działające wątki, aby je ograniczyć.
Jak mogę skutecznie wykonać tę liczbę?
Inne rzeczy próbowałem oceniamy następującą linię:
scalar(threads->list());
Ale to daje mi wartość dziwne, jak to jest unblessed odniesienia wierzę, że wygląda tak:
threads=SCALAR(0x80fea8c)
btw, to (stringification od a) * błogosławiony * ref – ikegami
bardzo BTW - pamiętajmy, że wątki w perlu nie przypominają nici w innych językach programowania - są bardzo głodne zasobów, ponieważ każdy wątek ma KOPIĘ wszystkich zmiennych.Wciąż są przydatne w niektórych przypadkach, ale w każdym przypadku, w którym muszę wykonać paralelację, rozwidlenia działają znacznie lepiej. Nie jest to bezpośrednio związane z twoim pytaniem, chciałem ci tylko powiedzieć. :) –
Jaka wersja Perla? Jaką wersję wątków? I czy twoje wątki są odłączone (być może samo-odłączające się w mySubName)? – pilcrow