[Rio-pm] Multi threads

Aureliano Guedes guedes_1000 em hotmail.com
Domingo Março 11 19:09:38 PDT 2012


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
 		 	   		  
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20120312/d5f22f47/attachment-0001.html>


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