2
我正在使用perl的Thread::Queue模塊來保持一個線程繁忙的下載網址爲我正在處理的一個簡單的爬蟲。使用Thread::Queue
,我排隊散列引用的列表(360,是精確的),其中每個哈希包含有關個別URL信息:perl Thread :: Queue not dequeueing all items
#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有什麼問題嗎?謝謝!
當它下降到260(退出或停止工作)後會發生什麼? – ikegami
這是一個循環的內部,所以它繼續循環的下一個循環,並開始在接下來的360個網址上工作。 – srchulo
Web請求可以是異步的,你不需要線程。 – jordanm