我在linux上使用Perl,我的内存使用率一直在上升,我相信是因为以前运行的线程没有被终止/连接。
我想我需要以某种方式通知已经结束/运行的线程,然后分离
它/它们会被自动清理,让我恢复记忆。。。
我试过return();使用$thrúList->join();&$thr戋List->detach();但是我的gui在使用join时很久都没有显示,而且mem问题似乎是
在分离中依然存在。。。任何帮助。。。
$mw->repeat(100, sub { # shared var handler/pivoting-point !?
while (defined(my $command = $q->dequeue_nb())) { #???
# to update a statusbar's text
$text->delete('0.0', "end");
$text->insert('0.0', $command);
$indicatorbar->value($val); # to update a ProgressBar's value to $val
$mw->update();
for ( @threadids ) { # @threadids is a shared array containing thread ids
# that is to say I have got the info I wanted from a thread and pushed its id into the above @threadids array.
print "I want to now kill or join the thread with id: $_\n";
#$thrWithId->detach();
#$thrWithId->join();
# then delete that id from the array
# delete $threadids[elWithThatIdInIt];
# as this seems to be in a repeat(100, sub... too, there are problems??!
# locks maybe?!?
# for ( @threadids ) if its not empty?!?
}
} # end of while
}); # end of sub
# Some worker... that works with the above handler/piviot me thinks#???
async {
for (;;) {
sleep(0.1);
$q->enqueue($StatusLabel);
}
}->detach();
我已经在这里上传了我的完整代码(http://cid-99cdb89630050fff.office.live.com/browse.aspx/.Public)如果需要的话,它在Boxy.zip中。。。
首先很抱歉在此回复,但我丢失了允许编辑的cookie。。。
非常感谢gangabass,这看起来是一个很好的信息,我将不得不花一些时间在它上,但至少它看起来像是其他人在问同样的问题。。。我担心我把事情弄得一团糟。
谢谢你们。。。
最佳答案
听起来你的加入很成功,但进展很慢?
perl中的线程不是轻量级的。创建和连接线程需要大量内存和时间。
如果您的任务允许,那么最好让线程继续运行并给它们额外的工作,而不是结束它们并在以后启动新线程。Thread::Queue可以帮上忙。也就是说,除非你是在Windows上,否则没有很多意义去做,而不是用叉子和Parallel::ForkManager。