thread shared perl

后端 未结 2 356
渐次进展
渐次进展 2021-01-25 15:18

i wrote a code and i need to make it multithreaded. Evething works, but every loop repeats 4 times:

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


        
2条回答
  •  佛祖请我去吃肉
    2021-01-25 16:21

    The problem is that you never remove from @groups, so all threads do all jobs in @groups.

    Here's one solution.

    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;
    

提交回复
热议问题