gpt4 book ai didi

multithreading - perl Thread::Queue 没有使所有项目出队

转载 作者:行者123 更新时间:2023-12-03 13:13:14 25 4
gpt4 key购买 nike

我正在使用 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 个 url 都被排入队列,但是我只看到待处理的数字下降到 260 左右,这意味着只有大约 100 个真正得到评估,而 260 永远不会这样做?我用 Thread::Queue 做错了什么吗?谢谢!

最佳答案

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

关于multithreading - perl Thread::Queue 没有使所有项目出队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13444792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com