Multithreading perl线程::队列未使所有项目退出队列

Multithreading perl线程::队列未使所有项目退出队列,multithreading,perl,Multithreading,Perl,我正在使用perl的模块让线程池忙于为我正在开发的一个简单爬虫下载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(@$ur

我正在使用perl的模块让线程池忙于为我正在开发的一个简单爬虫下载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个URL都被排队,但我只看到挂起的数量下降到大约260个,这意味着只有大约100个真正得到评估,而260个从未得到评估?我在使用Thread::Queue时有什么问题吗?谢谢

您确定没有看到任何错误吗?当我运行代码时,通过包“Thread::Queue”看到“找不到对象方法”end。查看Thread::Queue的文档,我没有看到任何关于结束函数的内容,所以这可能是代码中的一个错误。在我的测试中,每当调用$url_q->end时,“挂起”计数器就会停止,这取决于计算机的速度、当前负载以及线程调度方式。可能是在你的盒子上,这大约发生在260处。

当它下降到260处(退出或停止工作)后会发生什么?这是一个循环的内部,它一直在运行,因此它会继续循环的下一次迭代,并开始处理下一个360个URL。Web请求可以是异步的,您不需要线程。这意味着线程已退出,因此
$url\u h
为false或线程已死亡。首先找出哪个(使用
eval{}
)。可能是您排队的值为false(0,空字符串,未定义),导致循环终止,线程退出。