2017-01-20 1 views
2

В следующем скрипте:Perl getstore в потоке

use strict; 
use warnings; 
use LWP::Simple; 
use threads; 
threads->create(sub { 
    my $url = "http://www.example.com/logo.jpg"; 
    my $file = "/var/www/html/logo.jpg"; 
    getstore($url, $file); 
    threads->detach(); 
}); 

, когда я запускаю это не сохранить изображение, но если я запускаю тот же код не в теме это работает, почему?

+0

Почему вы используете 'threads'. – ssr1012

+0

Мне нужно запустить этот скрипт для множественного URL-адреса в то же время –

ответ

2

Поскольку «отсоединить» не делает то, что вы ожидаете. Отдельные потоки прекращаются, когда программа выходит. From the docs...

$ Thr-> открепление()

Делает нить несоединимое, и вызывает любое возможное возвращаемое значение будет отбрасываются. Когда программа выходит, любые отсоединенные потоки, которые все еще работают, молча завершаются.

Вы должны были получить такое сообщение.

Perl exited with active threads: 
    1 running and unjoined 
    0 finished and unjoined 
    0 running and detached 

Вместо отсоединения вы должны подождать, пока все потоки не будут завершены в конце вашей программы.

for my $thread (threads->list(threads::running)) { 
    $thread->join; 
} 

Если все, что вы хотите, чтобы сделать параллельные запросы HTTP, нет необходимости для потоков. LWP::Parallel, вероятно, будет более эффективным.

+0

Я бы также отметил, что для такого типа модели порождение нового потока за запрос - это действительно неэффективный способ сделать это, и вам будет намного лучше что-то вроде рабочего-нитей [что-то вроде этого] (http://stackoverflow.com/questions/26296206/perl-daemonize-with-child-daemons). Но 'LWP :: Parallel', вероятно, лучший выбор в этом сценарии :) – Sobrique

+0

Я ценю советы @Sobrique. Ответ Шверна правильный, спасибо! –

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