我有一個程序(Perl)能夠啓動大量線程(每個線程負責基於數據處理創建圖形)。 每個線程我開始使用:如何限制perl中並行線程的最大數量
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
螺紋火了正常,但過了一段時間,我已經打開其中幾個Perl解釋器崩潰後(我假設它關係到內存?)。所以我的解決方案是限制我一次打開的線程數,我選擇了15.我想在每條創建線之前添加一個sub,以檢查是否可以在下一個線程中觸發或執行睡眠一個完成。我試圖這樣做。
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());
但是,這給了我一個奇怪的值,就像它是一個unblessed引用我相信是這樣的:
threads=SCALAR(0x80fea8c)
順便說一句,這是(一個字串)*祝福*裁判 – ikegami 2012-07-22 01:33:27
非常,非常BTW - 請記住,perl中的線程不像其他編程語言中的線程 - 它們非常耗資源,因爲每個線程都具有所有變量的COPY。在某些情況下,它們仍然很有用,但在每個需要進行並行化的情況下,分叉的工作都會更好。這與你的問題沒有直接關係,我只是想告訴你。 :) – 2012-07-22 02:04:45
什麼版本的Perl?什麼版本的線程?你的線程是否分離(可能是mySubName中的自我分離)? – pilcrow 2012-07-22 03:39:45