perl Thread :: Queue没有出列所有项目

时间:2012-11-18 21:27:49

标签: multithreading perl

我正在使用perl的Thread::Queue模块来保持一个线程池忙于下载我正在处理的简单爬虫的URL。使用Thread::Queue,我将哈希引用列表排列(确切地说是360),其中每个哈希都包含有关各个URL的信息:

#set up thread queue
my $THREADS=30; # Number of threads
my $url_q = Thread::Queue->new(); # Work to do
my $url_arr = urls();

my $count = 0;
for(@$url_arr) { 
    print "ENQUEUEING $_->{'url'}\n";
    $url_q->enqueue($_);
    $count++;
}

print "COUNT $count\n";
print "QUEUE COUNT " . $url_q->pending() . "\n";

threads->create( sub { 
            while(my $url_h = $url_q->dequeue()) { 
                print "url: $url_h->{'url'}\n\n";
                print "PENDING: " . $url_q->pending() . "\n";
                process_url($url_h);
            }
        }) for (1..$THREADS);   

$url_q->end;
print "WAITING\n";
$_->join() for threads->list;
print "DONE WAITING\n";

问题在于我看到所有360个网址都被排队,但后来我只看到待处理的数字下降到260左右,这意味着只有大约100个真正被评估,260个从未做过?我用Thread :: Queue做错了吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您确定没有看到任何错误?当我运行你的代码时,我看到“无法找到对象方法”结束“通过包”Thread :: Queue“”。看看Thread :: Queue的文档,我没有看到任何提到结束函数,所以这可能是你的代码中的一个错误。在我的测试中,每当调用$ url_q-> end时,“PENDING”计数器将停止,这会随着计算机的速度,当前负载以及计划线程的方式而变化。可能是在你的盒子上,这大约发生在260。