四线程+队列,Mojo 本身支持多线程,不过还没学会 - =info
- 4线程+队列
- 523066680@163.com
- =cut
-
- use Modern::Perl;
- use Encode;
- use threads;
- use threads::shared;
- use Thread::Queue;
- use File::Basename;
- use URI::Escape;
- use Mojo::UserAgent;
- STDOUT->autoflush(1);
-
- my @ths;
- my $que = Thread::Queue->new(); # A new empty queue
- my $link = "http://pmmp.cnki.net/OperatingDiscipline/Details.aspx?id=";
- my @mission = map { sprintf "%s%04d", $link, $_ } (1 .. 2150);
-
- #创建线程
- grep { push @ths, threads->create( \&thread_func, $_ ) } ( 0..3 );
-
- $que->enqueue( @mission );
- $que->end();
- grep { $_->join() } @ths;
-
- exit;
-
- sub thread_func
- {
- my ( $id ) = shift;
- my ($link, $file, $res, $dom);
-
- my $ua = Mojo::UserAgent->new();
- $ua = $ua->max_redirects(5);
-
- while (defined(my $link = $que->dequeue()))
- {
- $file = basename( $link );
- $res = $ua->get( $link )->result;
- $res->body =~/(http.*?.pdf)/;
- $link = encode('gbk', decode('utf8', uri_unescape($1)));
- say $link;
- }
- }
复制代码 结果见附件 |