Eu tenho um código para threads que fiz a uns anos atras ele funciona como o Parallel::ForkManager, se quiser posso te passar a utilizacao dele é simples.<div><br></div><div>use threads::manager;</div><div>my $tm = threads::manager->new(100); # 100 max threads</div>

<div><br></div><div>for (0..1000) { $tm->create('func_ping') }</div><div><br></div><div>$tm->wait_all_threads();</div><div><br></div><div>sub func_ping { ... }</div><div><br></div><div>exit 0</div><div><br>
</div>
<div>Nesse exemplo ele abre no máximo 100 threads e vai abrindo mais threads conforme elas vao terminando, tem suporte a timeout tbm $tm->create({timeout => 5}, 'func_ping') assim, o modulo mata a thread se ela nao executar em 5 segundos.</div>

<div><br><br><div class="gmail_quote">2012/3/11 Aureliano Guedes <span dir="ltr"><<a href="mailto:guedes_1000@hotmail.com">guedes_1000@hotmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<div><div dir="ltr">
Bem, agora exclareceu mais o assunto na minha cabeça, contudo me deixou com mais medo de usar threads... hahaha.<br><br>Bem, esquecendo o assunto de redes, o que eu pretendo fazer é pingar um servidor, contudo inves de usar 4 bot para <br>

enviar 4 pings simultaneos eu quero usar uma unica maquina para enviar esses 4 pings. Mas é so uma questão de estudo<br>nada de underground.<br><br>Exemplos que achei na internet não davam muita mobilidade de escolher o numero de threads e tals.<br>

<br>Mas valeu, monges, me ajudou muito mesmo.<br><br><div><div></div>> Date: Sun, 11 Mar 2012 22:58:20 -0300<br>> From: <a href="mailto:viniciusmiasato@gmail.com" target="_blank">viniciusmiasato@gmail.com</a><div><div class="h5">

<br>> To: <a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a><br>> Subject: Re: [Rio-pm] Multi threads<br>> <br>> só para não ficar confuso demais, a variável $pool_thr[ $i ] não<br>> recebe o retorno das threads. ela serve como uma forma de controle das<br>

> threads, para efetuar join, detach ou executar outros métodos<br>> fornecidos,<br>> <br>> o link para a documentação mais detalhada estpa abaixo:<br>> <a href="http://perldoc.perl.org/threads.html" target="_blank">http://perldoc.perl.org/threads.html</a><br>

> <br>> abs.<br>> Japa<br>> <br>> Em 11 de março de 2012 22:53, Vinícius Miasato<br>> <<a href="mailto:viniciusmiasato@gmail.com" target="_blank">viniciusmiasato@gmail.com</a>> escreveu:<br>> > olá Aureliano,<br>

> ><br>> > parece que você está confundindo um pouco o conceito de threads.<br>> > quando uma thread é criada ela executa em paralelo ( assumindo que sua<br>> > máquina possui vários nucleos e seu SO dá suporte à multi-threads ).<br>

> ><br>> > o código que você citou espera a rotina terminar antes de iniciar uma<br>> > nova iteração do loop, já com threads, o loop continua mesmo sem a<br>> > thread retornar, caso a tarefa seja grande o suficiente,<br>

> ><br>> > o que o Buss falou está certo, então venho tentar adicionar algo à mais,<br>> ><br>> > como você não menciona nada sobre controle de threads, talvez você não<br>> > precise manter o controle das threads ao cria-las, então você pode<br>

> > efetuar um detach nelas, o que significa descartar qualquer retorno da<br>> > thread em questão. após um detach, a thread não poderá mais ser<br>> > controlada.<br>> ><br>> > caso queira esperar um thread específica retornar antes de criar as<br>

> > outras você  pode efetuar um join para aguardar o término da mesma,<br>> ><br>> > seria algo como:<br>> ><br>> > my $thr =  threads->create(\&sub1);<br>> > $thr->detach; # não queremos saber sobre o retorno desta thread e liberamos ela<br>

> ><br>> > ou<br>> ><br>> > my $thr2 =  threads->create(\&sub2);<br>> > my $resposta = $thr->join; # o retorno da sub2 atribuído à variável<br>> > escalar $resposta<br>> ><br>

> > para o caso de você querer receber o resultado de cada thread criada,<br>> > vale à ideía do Buss de criar um array no loop aonde as threads são<br>> > criadas,<br>> > ficando mais ou menos assim:<br>

> ><br>> > my @pool_thr;<br>> > for (my $i =1; $i = 5; $i++){<br>> >    $pool_thr[ $i ] = threads->create(\&sub1);<br>> > }<br>> ><br>> > sub sub1 {<br>> > ....<br>> > }<br>

> ><br>> > quanto ao exemplo do servidor, mesmo com threads ou forks, enfim<br>> > vários processos em paralelo, você ainda terá outro provável gargalo,<br>> > que é a parte de rede,<br>> ><br>

> > abs.<br>> > Japa<br>> ><br>> > 2012/3/11 Aureliano Guedes <<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>>:<br>> >> Na verdade, eu acho que minha pergunta que foi feita de forma errada.<br>

> >> Eu queria, por exemplo, dar ping em um servidor ate derruba-lo, contudo eu<br>> >> queria para isso enviar digamos, 5 pacotes simultaneos,<br>> >> inves de enviar 1 por vez.<br>> >><br>

> >> Mas eu entendi quanto a usar o laço, talvez eu realmente faça isso. Contudo,<br>> >> usar<br>> >><br>> >> for (my $i =1; $i <= 5; $i++){<br>> >> my $thr = threads->create(\&sub1);<br>

> >> }<br>> >><br>> >> não é o mesmo que usar apenas<br>> >><br>> >><br>> >> for (my $i =1; $i <= 5; $i++){<br>> >> &sub1;<br>> >> }<br>> >><br>

> >> se a função do meu sub1 for apenas enviar pacotes a um servidor???<br>> >><br>> >> ________________________________<br>> >> From: <a href="mailto:bruno.buss@gmail.com" target="_blank">bruno.buss@gmail.com</a><br>

> >> Date: Sun, 11 Mar 2012 22:29:06 -0300<br>> >><br>> >> To: <a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a><br>> >> Subject: Re: [Rio-pm] Multi threads<br>> >><br>

> >> 2012/3/11 Aureliano Guedes <<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>><br>> >><br>> >> Opa, Bruno, valeu a resposta, mas vamos ver se eu entendi<br>

> >><br>> >>  eu poderia fazer assim:<br>> >><br>> >>     use threads;<br>> >><br>> >><br>> >>     for (my $i =1; $i = 5; $i++){<br>> >>     my $thr = threads->create(\&sub1);<br>

> >><br>> >><br>> >>     sub sub1 {<br>> >><br>> >>     }<br>> >> }<br>> >><br>> >> Mas assim não ocorreria  execução simultanea, certo? Pois cada execução iria<br>

> >> ocorrer uma por vez a cada contagem do contador.<br>> >><br>> >><br>> >> A resposta para sua pergunta: errado.<br>> >> Porém sua explicação está "correta"... a cada iteração do for, será criada<br>

> >> uma nova thread, então você terá disparado diversas threads até o final do<br>> >> for.<br>> >><br>> >> Agora, o ponto em ser simultâneo é um pouco mais complicado: depende de<br>
> >> quantos cores tem seu sistema (se tiver menos cores que threads utilizadas,<br>
> >> então as threads estarão executando de forma concorrente e não simultânea),<br>> >> depende do escalonador de tarefas do seu sistema operacional, dependo do que<br>> >> a sua sub1 faz, etc.<br>

> >><br>> >> Mas acho que a sua dúvida é um pouco mais básica do que isso...<br>> >><br>> >> Fazer:<br>> >> for (my $i =1; $i <= 5; $i++){<br>> >> [alguma coisa]<br>

> >> }<br>> >><br>> >> é essencialmente igual a fazer [alguma coisa] 5 vezes (tirando o fato que<br>> >> você pode utilizar o parâmetro do for para fazer alterações):<br>> >> [alguma coisa]<br>

> >> [alguma coisa]<br>> >> [alguma coisa]<br>> >> [alguma coisa]<br>> >> [alguma coisa]<br>> >><br>> >> No seu caso,<br>> >> for (my $i =1; $i <= 5; $i++){<br>

> >> my $thr = threads->create(\&sub1);<br>> >> }<br>> >><br>> >> É igual a fazer:<br>> >> my $thr = threads->create(\&sub1);<br>> >> my $thr = threads->create(\&sub1);<br>

> >> my $thr = threads->create(\&sub1);<br>> >> my $thr = threads->create(\&sub1);<br>> >> my $thr = threads->create(\&sub1);<br>> >><br>> >> Que é exatamente o que você queria, não? ;-)<br>

> >><br>> >> [ ]'s<br>> >> --<br>> >> Bruno C. Buss<br>> >> <a href="http://brunobuss.wordpress.com/" target="_blank">http://brunobuss.wordpress.com/</a><br>> >> <a href="http://www.dcc.ufrj.br/~brunobuss/" target="_blank">http://www.dcc.ufrj.br/~brunobuss/</a><br>

> >><br>> >> _______________________________________________ Rio-pm mailing list<br>> >> <a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a> <a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>

> >><br>> >> _______________________________________________<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" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>

> _______________________________________________<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" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>

</div></div></div>                                      </div></div>
<br>_______________________________________________<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" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br></div>