【发布时间】:2012-07-21 23:00:41
【问题描述】:
我有一个程序 (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)
【问题讨论】:
-
顺便说一句,那是(a的字符串化)blessed ref
-
非常非常 BTW - 请记住 perl 中的线程与其他编程语言中的线程不同 - 它们非常消耗资源,因为每个线程都有所有变量的副本。它们在某些情况下仍然有用,但在我必须进行并行化的每种情况下,分叉的效果要好得多。它与您的问题没有直接关系,我只是想告诉您。 :)
-
什么版本的 Perl?什么版本的线程?您的线程是否已分离(可能在 mySubName 中自行分离)?
标签: multithreading perl