-1

以下代码的内存消耗在其执行过程中会增加。可能出了什么问题?我还需要做些什么才能从线程中干净地退出吗?

#!/usr/bin/perl -w
use strict;    

my  ($i,$URL);
my  @Thread;
my  $NUM_THREADS=4;
my  @response:shared =();
while(1)
{
    for($i=0;$i<$NUM_THREADS;$i++)
    {
         if( $response[$i] is processed)
         {
              $URL=FindNextURL();  
              $Thread[$i]=new threads \&Get,$i,$URL;
              $Thread[$i]->detach();
         }
    }
    # wait for atleast one $response[$i]
    # if ready process it               
}

sub Get
{
    my $i=$_[0];
    my $URL=$_[1];        
    $response[$i]=FetchURL($URL);
    return;
}
4

1 回答 1

2

来自http://perldoc.perl.org/threads.html

“在大多数系统上,频繁且持续地创建和销毁线程会导致 Perl 解释器的内存占用不断增加。虽然启动线程然后 ->join() 或 ->detach() 很简单它们,对于长期存在的应用程序,最好维护一个线程池,并在需要的工作中重用它们,使用队列来通知线程待处理的工作。这个模块的 CPAN 分发包含一个简单的例子(examples/pool_reuse .pl) 说明了可重用线程池的创建、使用和监控。”

请尝试进行主题投票。

于 2012-04-25T09:26:53.680 回答