<div dir="ltr">Recomendo usar qualquer coisa menos forks para fazer downloads.<div><br></div><div>Forks são pesados, geram muitas trocas de contextos desnecessárias para tarefas tão triviais como downloads em paralelo. </div><div><br></div><div><br></div><div>Se o yada ta complicado, ainda tem o <a href="https://metacpan.org/pod/HTTP::Async">https://metacpan.org/pod/HTTP::Async</a> que com o Future fica uma mão na roda</div><div><br></div><div>Algo como:</div><div><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace">use Future;</font></div><div><font face="monospace, monospace">use Future::Utils qw( try_repeat fmap1 );</font></div><div><font face="monospace, monospace">use IO::Async::Loop;</font></div><div><font face="monospace, monospace">use Net::Async::HTTP;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">my $loop = IO::Async::Loop->new;</font></div><div><font face="monospace, monospace">my $http = Net::Async::HTTP->new(  # serio, é assim q eu uso em produção, com </font><span style="font-family:monospace,monospace">max_connections_per_host=400</span></div><div><font face="monospace, monospace">    max_connections_per_host => 400,</font></div><div><font face="monospace, monospace">    timeout                  => 10 * 60</font></div><div><font face="monospace, monospace">);</font></div><div><font face="monospace, monospace">$loop->add($http);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">sub DO_SOMETHING {</font></div><div><font face="monospace, monospace">    my ( $algum_content, $url, $algum_contexto_talvez ) = @_;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    my $what = $http->do_request(</font></div><div><font face="monospace, monospace">        method       => 'GET PORT DELETE...',</font></div><div><font face="monospace, monospace">        uri          => "$url",</font></div><div><font face="monospace, monospace">        content_type => 'text/plain',</font></div><div><font face="monospace, monospace">        headers      => [</font></div><div><font face="monospace, monospace">            'Content-Type' => 'text/plain'</font></div><div><font face="monospace, monospace">        ],</font></div><div><font face="monospace, monospace">        content => ( join "\n", @$algum_content )</font></div><div><font face="monospace, monospace">    );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    $what = try_repeat { $what } until => sub {</font></div><div><font face="monospace, monospace">        eval { $_[0]->get->code == 200 };</font></div><div><font face="monospace, monospace">    };</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    return $what;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace">my @futures;</font></div><div><font face="monospace, monospace">for my $url ( 1 ... 100 ) {</font></div><div><font face="monospace, monospace">    my $future =</font></div><div><font face="monospace, monospace">      DO_SOMETHING( [...], $url, $algum_contexto_talvez )->on_done(</font></div><div><font face="monospace, monospace">        sub {</font></div><div><font face="monospace, monospace">            my $res = shift;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">            if ( $res->content =~ /401 Unauthorized/ ) {</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">                # trata como se fosse erro, por exemplo</font></div><div><font face="monospace, monospace">            }</font></div><div><font face="monospace, monospace">            else {</font></div><div><font face="monospace, monospace">                # ...</font></div><div><font face="monospace, monospace">            }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">      )->on_fail(</font></div><div><font face="monospace, monospace">        sub {</font></div><div><font face="monospace, monospace">            my $failure = shift;</font></div><div><font face="monospace, monospace">            log_error "error: $failure";</font></div><div><font face="monospace, monospace">        }</font></div><div><font face="monospace, monospace">      );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    push @futures, $future;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">my @results = Future->needs_all(@futures)->get;</font></div></div></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-05-24 16:53 GMT-03:00 Felipe Leprevost <span dir="ltr"><<a href="mailto:leprevostfv@gmail.com" target="_blank">leprevostfv@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="color:rgb(33,33,33)">Apenas como curiosidade Aureliano, de onde você está tentando obter os arquivos ?</span><br><br><div class="gmail_quote"><div dir="ltr">On Wed, May 24, 2017 at 3:21 PM Felipe da Veiga Leprevost <<a href="mailto:felipe@leprevost.com.br" target="_blank">felipe@leprevost.com.br</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Apenas como curiosidade Aureliano, de onde você está tentando obter os arquivos ?</div><div><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Wed, May 24, 2017 at 3:19 PM Aureliano Guedes <<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div>

<div id="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif" dir="ltr">
<p>Opa,<br>
<br>
Yada achei muito complicado pra pouca coisa que vou fazer. Mas to convencido a tentar.<br>
<br>
Breno, o truncado é por causa que estou fazendo varios downloads com o Parallel::ForkManager de um arquivo no formato texto, onde cada identificador é um dado do arquivo, como eu trabalho com milhoes desses identificadores e o servidor recomenda se limitar
 a 500 por requisição acaba que tenho que fazer varios downloads. So que to imprimindo tudo em STDOUT e redirecionando a saida pra um aarquivo estilo UNIX mesmo > , então tem varios processo tenetando escrever na tela ao mesmo tempo, eu pensei em fazer um lock
 mas acho q isso vai fazer demorar.</p>
<p><br>
</p>
<p>Exatamente aqui é o problema, IPC::ShareTable ou algo assim deve resolver. Alguma sujestão de solução ?</p>
<p><br>
</p>
<div>my $pm = new Parallel::ForkManager($req);</div>
<div>while(my $id = <$IN>){</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>$cnt++;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>chomp $id;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>if ($cnt == $split || $. == $nl){ #$split = 500; </div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>push @ids, $id;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>my @tmp = @ids;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>undef @ids;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>$cnt = 0;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="font-size:12pt;white-space:pre-wrap"></span><span style="font-size:12pt">$pm->start and next; # do the fork</span><br>
</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="font-size:12pt;white-space:pre-wrap"></span><span style="font-size:12pt">my @resp = get_fasta(\@tmp, $db, $timeout); </span><br>
</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>if ($resp[0]){</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>$resp[1] =~ s/^\s*\n+//mg;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>print STDOUT $resp[1];</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="font-size:12pt;white-space:pre-wrap"></span><span style="font-size:12pt">}</span><br>
</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>else{</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>print STDERR "Status: $resp[2]\n$resp[3]\nDetails: $resp[1]\n";</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="font-size:12pt;white-space:pre-wrap"></span><span style="font-size:12pt">print STDERR join (" ", "Fail:", @tmp, "\n");</span><br>
</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>}</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>$pm->finish; #tihs is a fork, at the end (here) the memory will be released </div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>}</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>else{</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>push @ids, $id;</div>
<div><span class="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176Apple-tab-span" style="white-space:pre-wrap"></span>}</div>
<div>} </div>
<div>$pm->wait_all_children;</div>
<br>
<br>
<p></p>
</div>
<hr style="display:inline-block;width:98%">
<div id="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Rio-pm <rio-pm-bounces+guedes_1000=<a href="mailto:hotmail.com@pm.org" target="_blank">ho<wbr>tmail.com@pm.org</a>> on behalf of breno <<a href="mailto:oainikusama@gmail.com" target="_blank">oainikusama@gmail.com</a>><br>
<b>Sent:</b> Wednesday, May 24, 2017 3:54:47 AM<br>
<b>To:</b> Perl Mongers Rio de Janeiro<br>
<b>Subject:</b> Re: [Rio-pm] Metodos de Download em Massa</font>
<div> </div>
</div>
<div>
<p dir="ltr">Oi Aureliano,</p>
<p dir="ltr">se você está interessado em benchmarks, pode experimentar o LWP::Curl em vez do Furl, ou se tiver paciência pra ir direto ao metal, Net::Curl ou WWW::Curl.</p>
<p dir="ltr">O que quer dizer com "truncado"? Se a conexão cai depois de X bytes baixados (e se vc consegue garantir que o arquivo parcial contém apenas dados válidos), vc pode baixar só o que falta e depois juntar os dois pedaços na mão. Por exemplo, se o
 arquivo parcial foi baixado em "parcial.tmp":</p>
<p dir="ltr">---------8<---------<br>
my $ua = Furl->new;<br>
my $res = $ua->get( '<a href="http://exemplo.com/arquivo.tmp" target="_blank">http://exemplo.com/arquivo.<wbr>tmp</a>', Range => 'byes=' . -s 'parcial.tmp' . '-');<br>
open my $ fh, '>>', 'parcial.tmp;<br>
print $fh, $res->content;<br>
close $fh;<br>
---------8<---------</p>
<p dir="ltr">(código não testado, estou no celular)</p>
<p dir="ltr">Se o servidor suporta conteúdo parcial (ele responde o primeiro request com Accept-Ranges), isso deve baixar o resto do arquivo. Idealmente, em vez de sobrescever o arquivo parcial, vc junta o conteúdo dos dois em um terceiro arquivo.</p>
<p dir="ltr">Finalmente, se quiser baixar vários pedaços do arquivo em paralelo, pode experimentar o HTTP::Range e o LWP::Parallel::UserAgent, ou se inspirar neles e implementar sua própria solução paralela com Furl ou LWP::Curl.</p>
<p dir="ltr">[]s<br>
-b</p>
<br>
<div class="gmail_quote">
<div dir="ltr">On 23:26, Tue, 23 May 2017 Aureliano Guedes, <<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>> wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div id="m_-3402925668689683065m_-4939435173408687090m_-3800307471242624176m_9146569206389881045divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif" dir="ltr">
<p>Ola Monges,</p>
<p><br>
</p>
<p>Gostaria de saber qual metodo vocês mais gostam para fazer downloads em massa.<br>
</p>
<p><br>
Eu usava muito LWP, recentemente comecei usar uma combinação de Parallel::ForkManager e Furl, mas pra meu tipo de dado tem truncado parte dos download. (vale uma dica pra lidar com dados truncados?)
<br>
<br>
No meu caso, eu to fazendo download de mais me milhoes de sequencias, pra isso eu sigo a regra do servidor e peço apenas 500 por vez e limito em 10 fork.<br>
<br>
Tem outros metodos que posso usar mas acabo perdendo e muito a eficiência. Por isso pretendo testar um benchmark em varias formas diferentes.<br>
<br>
Bom, sei que existem ferramentas, BioPerl, etc... <br>
<br>
Abraços,<br>
acpguedes<br>
</p>
</div>
</div>
______________________________<wbr>_________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" rel="noreferrer" target="_blank">http://mail.pm.org/mailman/<wbr>listinfo/rio-pm</a></blockquote>
</div>
</div>
</div>

______________________________<wbr>_________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" rel="noreferrer" target="_blank">http://mail.pm.org/mailman/<wbr>listinfo/rio-pm</a></blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr"><div class="m_-3402925668689683065m_-4939435173408687090gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><span>Felipe da Veiga Leprevost, Ph.D.</span><div><span><a>www.leprevost.com.br</a><br></span><div><span>Proteome Bioinformatics Lab</span></div><div><span>University of Michigan</span></div></div></div></div></div></div></div></div></font></span></blockquote></div></div><span class="HOEnZb"><font color="#888888"><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr"><div class="m_-3402925668689683065gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><span>Felipe da Veiga Leprevost, Ph.D.</span><div><span><a>www.leprevost.com.br</a><br></span><div><span>Proteome Bioinformatics Lab</span></div><div><span>University of Michigan</span></div></div></div></div></div></div></div></div>
</font></span><br>______________________________<wbr>_________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" rel="noreferrer" target="_blank">http://mail.pm.org/mailman/<wbr>listinfo/rio-pm</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div><font color="#333333" size="1">YAGNI</font><span style="color:rgb(51,51,51);font-size:x-small">,</span></div><div><span style="color:rgb(51,51,51);font-size:x-small">Renato CRON</span></div><div><div style="text-align:right"><font size="1" color="#333333"><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a></font></div></div><div style="text-align:right"><font size="1" color="#333333"><a href="http://twitter.com/#!/renato_cron" target="_blank">@renato_cron</a></font></div></div></div></div>
</div>