[Rio-pm] Multi threads

Blabos de Blebe blabos em gmail.com
Domingo Março 11 20:38:44 PDT 2012


> Bem, agora exclareceu mais o assunto na minha cabeça, contudo me deixou com
> mais medo de usar threads... hahaha.

Se você tem medo de usar threads, então você não está pronto pra usar threads.

> 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.

Estudo, sei...

Bem, uma rede bem configurada vai solenemente cagar pro seus pings,
então vou supor que você está estudando como configurar redes de forma
a evitar um DoD por ping. Ainda dá pra derrubar servidor com ping hoje
em dia?

> Exemplos que achei na internet não davam muita mobilidade de escolher o
> numero de threads e tals.

Exemplos de threads que você (você, um sujeito genérico, ok)
normalmente são porcaria. O que você precisa é ler com atenção o livro
de SO do tio Tanenbaum http://www.pearsonhighered.com/tanenbaum.

...

Tem uma coisa que a maioria ignora sobre threads, que é o fato de elas
serem utilizadas para rodar código em paralelo quando o processador
está *ocioso*.

Lembre-se sempre que há um custo para o SO fazer a troca de contexto e
se o seu código for CPU bound, fazer o processador ficar chaveando
contexto quando ele deveria estar processando, é perda de tempo.

Threads são melhores utilizadas para executar tarefas enquanto alguma
parte do código está esperando I/O. Por exemplo, interface gráfica,
que fica fica esperando o usuário interagir, ou ainda código que faz
I/O, como o seu caso.

Fique esperto também com a afinidade. Não necessariamente quatro
threads rodando em um processador com quatro núcleos vão rodar cada
uma em um núcleo. Eventualmente, você pode criar N threads que rodem
em apenas um dos núcleos, e aí você se lascou.


[]'s





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


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