我正在使用perl的threads模塊,它帶有一個簡單的搜尋器,我正在開發,因此我可以並行下載頁面。 Ocasionally,我得到錯誤信息像這樣的:perl線程異常退出
Thread 7 terminated abnormally: read timeout at /usr/lib64/perl5/threads.pm line 101.
Thread 15 terminated abnormally: Can't connect to burgundywinecompany.com:80 (connect: timeout) at /usr/lib64/perl5/threads.pm line 101.
Thread 19 terminated abnormally: write failed: Connection reset by peer at /usr/lib64/perl5/threads.pm line 101.
當我線性運行該腳本無緒,我不會遇到這些錯誤。這些錯誤幾乎看起來像是來自LWP::UserAgent模塊,但他們似乎不應該導致線程異常退出。使用perl的線程時是否需要採取一些額外的預防措施?謝謝!
UPDATE:
我已經找到了這些異常終止的來源,它似乎是,每當我做使用LWP::UserAgent
的請求。如果我刪除方法調用來下載網頁,則錯誤將停止。
示例腳本
下面的腳本會導致一個錯誤,我說的。最後瀏覽的網址就會超時,導致什麼應該僅僅是HTTP :: Repsonse對象的一部分,而不是導致線程異常終止:
#!/usr/bin/perl
use threads;
use Thread::Queue;
use LWP::UserAgent;
my $THREADS=10; # Number of threads
#(if you care about them)
my $workq = Thread::Queue->new(); # Work to do
my @stufftodo = qw(http://www.collectorsarmoury.com/ http://burgundywinecompany.com/ http://beetreeminiatures.com/);
$workq->enqueue(@stufftodo); # Queue up some work to do
$workq->enqueue("EXIT") for(1..$THREADS); # And tell them when
threads->create("Handle_Work") for(1..$THREADS); # Spawn our workers
$_->join for threads->list;
sub Handle_Work {
while(my $todo=$workq->dequeue()) {
last if $todo eq 'EXIT'; # All done
print "$todo\n";
my $ua = LWP::UserAgent->new;
my $RESP = $ua->get($todo);
}
threads->exit(0);
}
您是否確保爲每個線程獲取所有內容的新實例?審覈代碼以確保每個線程中都沒有共享,每個線程都需要初始化自己的perl對象,很少應該傳入(比如只有URL),並且不應該訪問共享的全局變量。我懷疑這個問題只是設計錯誤。 –
@DarrylMiles,我已經發布了上面的示例腳本,導致錯誤。我很確定在這個腳本文件中沒有共享任何東西,但我仍然得到錯誤。 – srchulo
好的腳本至少我們可以看到你在做什麼。你只有4個項目放置在$ workq中,但是你啓動了10個線程,每個線程可以在多個項目上工作。第四個線程不可能看到任何工作要做。目標網站是由您擁有/管理的嗎?你怎麼知道他們沒有連接氾濫控制?原始錯誤中的線程編號指示超過10個(如果它們是連續的)。可以將子線程添加到當前線程啓動開始/停止以及所有工作的總數中,也會在所有輸出中發出threads-> tid()。也許你更好地看問題。 –