[Rio-pm] Multi threads

Vinícius Miasato viniciusmiasato em gmail.com
Domingo Março 11 18:58:20 PDT 2012


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


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