2012-11-18 72 views
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有什麼問題嗎?謝謝!

+2

當它下降到260(退出或停止工作)後會發生什麼? – ikegami

+0

這是一個循環的內部,所以它繼續循環的下一個循環,並開始在接下來的360個網址上工作。 – srchulo

+0

Web請求可以是異步的,你不需要線程。 – jordanm

回答

0

您確定沒有看到任何錯誤?當我運行你的代碼時,我通過包「Thread :: Queue」看到「Can not locate object method」end「」。看看Thread :: Queue的文檔,我沒有看到任何提及的結束函數,所以也許這是你的代碼中的一個錯誤。在我的測試中,只要調用$ url_q-> end,「PENDING」計數器就會停止,這取決於計算機的速度,當前負載以及它如何調度線程。這可能是在你的盒子上,這發生在大約260.