[Rio-pm] Multi threads

Lucas Mateus lucasmateus.oliveira em gmail.com
Domingo Março 11 20:23:27 PDT 2012


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.

use threads::manager;
my $tm = threads::manager->new(100); # 100 max threads

for (0..1000) { $tm->create('func_ping') }

$tm->wait_all_threads();

sub func_ping { ... }

exit 0

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.


2012/3/11 Aureliano Guedes <guedes_1000 em hotmail.com>

>  Bem, agora exclareceu mais o assunto na minha cabeça, contudo me deixou
> com mais medo de usar threads... hahaha.
>
> Bem, esquecendo o assunto de redes, o que eu pretendo fazer é pingar um
> servidor, contudo inves de usar 4 bot para
> enviar 4 pings simultaneos eu quero usar uma unica maquina para enviar
> esses 4 pings. Mas é so uma questão de estudo
> nada de underground.
>
> Exemplos que achei na internet não davam muita mobilidade de escolher o
> numero de threads e tals.
>
> Mas valeu, monges, me ajudou muito mesmo.
>
> > Date: Sun, 11 Mar 2012 22:58:20 -0300
> > From: viniciusmiasato em gmail.com
>
> > To: rio-pm em pm.org
> > Subject: Re: [Rio-pm] Multi threads
> >
> > só para não ficar confuso demais, a variável $pool_thr[ $i ] não
> > recebe o retorno das threads. ela serve como uma forma de controle das
> > threads, para efetuar join, detach ou executar outros métodos
> > fornecidos,
> >
> > o link para a documentação mais detalhada estpa abaixo:
> > http://perldoc.perl.org/threads.html
> >
> > abs.
> > Japa
> >
> > Em 11 de março de 2012 22:53, Vinícius Miasato
> > <viniciusmiasato em gmail.com> escreveu:
> > > olá Aureliano,
> > >
> > > parece que você está confundindo um pouco o conceito de threads.
> > > quando uma thread é criada ela executa em paralelo ( assumindo que sua
> > > máquina possui vários nucleos e seu SO dá suporte à multi-threads ).
> > >
> > > o código que você citou espera a rotina terminar antes de iniciar uma
> > > nova iteração do loop, já com threads, o loop continua mesmo sem a
> > > thread retornar, caso a tarefa seja grande o suficiente,
> > >
> > > o que o Buss falou está certo, então venho tentar adicionar algo à
> mais,
> > >
> > > como você não menciona nada sobre controle de threads, talvez você não
> > > precise manter o controle das threads ao cria-las, então você pode
> > > efetuar um detach nelas, o que significa descartar qualquer retorno da
> > > thread em questão. após um detach, a thread não poderá mais ser
> > > controlada.
> > >
> > > caso queira esperar um thread específica retornar antes de criar as
> > > outras você  pode efetuar um join para aguardar o término da mesma,
> > >
> > > seria algo como:
> > >
> > > my $thr =  threads->create(\&sub1);
> > > $thr->detach; # não queremos saber sobre o retorno desta thread e
> liberamos ela
> > >
> > > ou
> > >
> > > my $thr2 =  threads->create(\&sub2);
> > > my $resposta = $thr->join; # o retorno da sub2 atribuído à variável
> > > escalar $resposta
> > >
> > > para o caso de você querer receber o resultado de cada thread criada,
> > > vale à ideía do Buss de criar um array no loop aonde as threads são
> > > criadas,
> > > ficando mais ou menos assim:
> > >
> > > my @pool_thr;
> > > for (my $i =1; $i = 5; $i++){
> > >    $pool_thr[ $i ] = threads->create(\&sub1);
> > > }
> > >
> > > sub sub1 {
> > > ....
> > > }
> > >
> > > quanto ao exemplo do servidor, mesmo com threads ou forks, enfim
> > > vários processos em paralelo, você ainda terá outro provável gargalo,
> > > que é a parte de rede,
> > >
> > > abs.
> > > Japa
> > >
> > > 2012/3/11 Aureliano Guedes <guedes_1000 em hotmail.com>:
> > >> Na verdade, eu acho que minha pergunta que foi feita de forma errada.
> > >> Eu queria, por exemplo, dar ping em um servidor ate derruba-lo,
> contudo eu
> > >> queria para isso enviar digamos, 5 pacotes simultaneos,
> > >> inves de enviar 1 por vez.
> > >>
> > >> Mas eu entendi quanto a usar o laço, talvez eu realmente faça isso.
> Contudo,
> > >> usar
> > >>
> > >> for (my $i =1; $i <= 5; $i++){
> > >> my $thr = threads->create(\&sub1);
> > >> }
> > >>
> > >> não é o mesmo que usar apenas
> > >>
> > >>
> > >> for (my $i =1; $i <= 5; $i++){
> > >> &sub1;
> > >> }
> > >>
> > >> se a função do meu sub1 for apenas enviar pacotes a um servidor???
> > >>
> > >> ________________________________
> > >> From: bruno.buss em gmail.com
> > >> Date: Sun, 11 Mar 2012 22:29:06 -0300
> > >>
> > >> To: rio-pm em pm.org
> > >> Subject: Re: [Rio-pm] Multi threads
> > >>
> > >> 2012/3/11 Aureliano Guedes <guedes_1000 em hotmail.com>
> > >>
> > >> Opa, Bruno, valeu a resposta, mas vamos ver se eu entendi
> > >>
> > >>  eu poderia fazer assim:
> > >>
> > >>     use threads;
> > >>
> > >>
> > >>     for (my $i =1; $i = 5; $i++){
> > >>     my $thr = threads->create(\&sub1);
> > >>
> > >>
> > >>     sub sub1 {
> > >>
> > >>     }
> > >> }
> > >>
> > >> Mas assim não ocorreria  execução simultanea, certo? Pois cada
> execução iria
> > >> ocorrer uma por vez a cada contagem do contador.
> > >>
> > >>
> > >> A resposta para sua pergunta: errado.
> > >> Porém sua explicação está "correta"... a cada iteração do for, será
> criada
> > >> uma nova thread, então você terá disparado diversas threads até o
> final do
> > >> for.
> > >>
> > >> Agora, o ponto em ser simultâneo é um pouco mais complicado: depende
> de
> > >> quantos cores tem seu sistema (se tiver menos cores que threads
> utilizadas,
> > >> então as threads estarão executando de forma concorrente e não
> simultânea),
> > >> depende do escalonador de tarefas do seu sistema operacional, dependo
> do que
> > >> a sua sub1 faz, etc.
> > >>
> > >> Mas acho que a sua dúvida é um pouco mais básica do que isso...
> > >>
> > >> Fazer:
> > >> for (my $i =1; $i <= 5; $i++){
> > >> [alguma coisa]
> > >> }
> > >>
> > >> é essencialmente igual a fazer [alguma coisa] 5 vezes (tirando o fato
> que
> > >> você pode utilizar o parâmetro do for para fazer alterações):
> > >> [alguma coisa]
> > >> [alguma coisa]
> > >> [alguma coisa]
> > >> [alguma coisa]
> > >> [alguma coisa]
> > >>
> > >> No seu caso,
> > >> for (my $i =1; $i <= 5; $i++){
> > >> my $thr = threads->create(\&sub1);
> > >> }
> > >>
> > >> É igual a fazer:
> > >> my $thr = threads->create(\&sub1);
> > >> my $thr = threads->create(\&sub1);
> > >> my $thr = threads->create(\&sub1);
> > >> my $thr = threads->create(\&sub1);
> > >> my $thr = threads->create(\&sub1);
> > >>
> > >> Que é exatamente o que você queria, não? ;-)
> > >>
> > >> [ ]'s
> > >> --
> > >> Bruno C. Buss
> > >> http://brunobuss.wordpress.com/
> > >> http://www.dcc.ufrj.br/~brunobuss/
> > >>
> > >> _______________________________________________ Rio-pm mailing list
> > >> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
> > >>
> > >> _______________________________________________
> > >> Rio-pm mailing list
> > >> Rio-pm em pm.org
> > >> http://mail.pm.org/mailman/listinfo/rio-pm
> > _______________________________________________
> > Rio-pm mailing list
> > Rio-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/rio-pm
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20120312/5235c822/attachment.html>


Mais detalhes sobre a lista de discussão Rio-pm