私が取り組んでいる単純なクローラーで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 のスレッドを使用する際に特に注意すべきことはありますか? ありがとう!
アップデート:
これらの異常終了の原因を突き止めましたが、LWP::UserAgent
. メソッド呼び出しを削除して Web ページをダウンロードすると、エラーが停止します。
サンプルスクリプト
以下のスクリプトは、私が話している 1 つのエラーを引き起こします。最後の URL がタイムアウトし、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);
}