1

コードを書いたので、マルチスレッドにする必要があります。すべてが機能しますが、すべてのループが 4 回繰り返されます。

use LWP::UserAgent;
use HTTP::Cookies;
use threads;
use threads::shared;

$| = 1;

$threads = 4;
my @groups :shared = loadf('groups.txt');

my @thread_list = ();
$thread_list[$_] = threads->create(\&thread) for 0 .. $threads - 1;
$_->join for @thread_list;
thread();

sub thread
{
    my $url = 'http://www.site.ru/';
    my $response = $web->post($url, Content =>
                    ['st.redirect' => ''
                    ]);
    foreach $i (@groups)
    {

        my $response  = $web->get($i);
        if(!($response->header('Location')))
        {
            ---------;
        }
        else
        {
            ----------;
        }

    }

}

sub loadf {
    open (F, "<".$_[0]) or erroropen($_[0]); 
    chomp(my @data = <F>);
    close F;
    return @data;
}

groups.txt :

http://www.odnoklassniki.ru/group/47357692739634
http://www.odnoklassniki.ru/group/56099517562922

スレッドを使用する必要があることを理解しています::共有; しかし、私はそれを使用する方法を理解できません。


あなたの投稿には、コード セクションを説明するコンテキストがあまりありません。シナリオをより明確に説明してください。

4

2 に答える 2

6

問題は、 から削除しないため@groups、すべてのスレッドが ですべてのジョブを実行すること@groupsです。

これが1つの解決策です。

use threads;
use Thread::Queue 3.01 qw( );

my $NUM_WORKERS = 4;

sub worker {
   my ($url) = @_;
   ... download the page ...
}

my $q = Thread::Queue->new();
for (1..$NUM_WORKERS) {
   async {
      while (my $url = $q->dequeue()) {
         worker($url);
      }
   };
}

$q->enqueue($_) for loadf('groups.txt');
$q->end();
$_->join() for threads->list;
于 2012-08-28T23:09:19.507 に答える
3

なぜスレッド化する必要があるのですか?ほとんどの場合、perl は forks を使用した方がはるかに優れています。

つまり、コードは 4 つのスレッドを開始し、それぞれが @groups 内のすべてを処理します。それはあなたがやりたいことではないようです。@groups を実行する作業のキューにしたい場合は、Thread::Queue (または Parallel::ForkManager) を見てください。

于 2012-08-28T23:13:16.187 に答える