我在Linux机器上使用Perl并且我的内存使用率正在上升,我相信因为之前运行的线程尚未被杀死/加入。 我想我需要以某种方式发信号通知已完成/运行终止的线程,然后分离 它/他们将自动清理它给我回忆......
我试过return(); with $ thr_List-> join(); &安培; $ thr_List->分离();但是我的gui并没有显示加入的年龄,并且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,看起来很棒的信息,我将不得不花一些时间在它上面,但至少看起来其他人都在问同样的问题......我担心我总是弄得一团糟的东西。
谢谢你们......
答案 0 :(得分:1)
所以听起来你加入了工作,但速度很慢?
perl中的线程不是轻量级的。创建和连接线程需要大量的内存和时间。 如果您的任务允许,最好保持线程运行并为其提供额外的工作,而不是结束它们并在以后启动新线程。 Thread::Queue可以为此提供帮助。也就是说,除非你在Windows上,否则没有太多意义,而不是分叉和使用Parallel::ForkManager。
答案 1 :(得分:0)
您需要仅使用一个工作线程并从中更新GUI 。其他线程只处理队列中的数据,不需要终止它们。
有关详细信息,请参阅this示例