[Rio-pm] Multi threads

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


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