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