2014-01-29 3 views
1

Как реализовать многопоточность в моем коде, чтобы сократить время.Внедрить многопоточность в perl при извлечении файла с удаленного сервера?

if(exists $ddts_attachments->{$id}->{'urls'}){ 
    sub do { 
    foreach my $url(sort keys %{$ddts_attachments->{$id}->{'urls'}}){ 
     $ENV{HTTP_proxy}=$proxy_url; 
     my $ff = File::Fetch->new(uri => $url); 
     my $where = $ff->fetch(to => "/attachments5/$id/"); 
     my $file = $ff->file; 
     delete $ENV{HTTP_proxy}; 
     print "url: $file attached to $id key \n ......\n"; 
    } 
    } 
} 

здесь В хэш $ddts_attachments я хранится список URL-адресов, из этих URL-адресов, которые я должен получить файлы и хранить в директории. , пожалуйста, любой может помочь мне, как реализовать многопоточность, что помогает сократить время.

+0

операционной системы? – ysth

+0

теперь я бегу в окнах. но в будущем он должен работать в linux –

ответ

0

Вот один из возможных решений:

use strict; 
use threads; 
use Thread::Queue; 

my $queue = Thread::Queue->new(); 
my @threads; 
my $maxthread = 5; #how many threads are you want 
push @threads, threads->create(\&worker) for 1 .. $maxthread; 

if(exists $ddts_attachments->{$id}->{'urls'}){ 
    foreach my $url(sort keys %{ $ddts_attachments->{$id}->{'urls'} }){ 
     $queue->enqueue($url);  
    } 
    $queue->enqueue(undef) for 1 .. $maxthread; #no more data to process 
} 
#wait here until all worker finish 
$_->join for @threads; 

sub worker { 
    while (defined(my $url = $queue->dequeue)) { 
     my $tid = threads->tid; 
     print "Thread $tid got $url\n"; 
     #download and store the url 
     local $ENV{HTTP_proxy} = $proxy_url; 
     my $ff = File::Fetch->new(uri => $url); 
     my $where = $ff->fetch(to => "/attachments5/$id/"); 
     my $file = $ff->file; 
     print "Thread $tid url: $file attached to $id key \n ......\n";  
    } 
} 
+0

спасибо за ответ amon, Но как получить значение url в подпрограмме? –

+0

@ user3177669 Я не писал код, user1126070 сделал. URL-адрес передается работнику через '$ queue'. В чем ваш вопрос? – amon

+0

Отличная работа –

Смежные вопросы