2

私は 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 前後にしか落ちていないことです。私が Thread::Queue でやっている問題はありますか? ありがとう!

4

1 に答える 1

0

エラーはありませんか? コードを実行すると、「パッケージ "Thread::Queue" 経由でオブジェクト メソッド "end" が見つかりません」と表示されます。Thread::Queue のドキュメントを見ると、終了関数について言及されていないので、おそらくこれはコードの間違いです。私のテストでは、「PENDING」カウンターは $url_q->end が呼び出されるたびに停止します。これは、コンピューターの速度、現在の負荷、およびスレッドのスケジュール方法によって異なります。お使いのボックスでは、これは約 260 で発生する可能性があります。

于 2012-12-15T19:56:03.443 に答える