[Cascavel-pm] Threads

Solli Moreira Honorio shonorio em terra.com.br
Quarta Agosto 31 10:24:02 PDT 2005


Cara,
Você vai ter que criar o mecanismo de controle da quantidade de threads está sendo executada, eu recomendo você dar uma olhada no link http://migo.sixbit.org/papers/Perl_Threads/slide-index.html para ter uma boa visão sobre threads e http://search.cpan.org/search?query=Threads&mode=all para as ferramentas de threads.

Estou enviando os código abaixos para vc ver como poderia ser 'controlado' estas threads.

<code>
use threads;
use threads::shared;
our $TCounter : shared;
$MaxThreads = 25;
while ( loop de alguma coisa ) {
  lock ( $TCounter ); 
  $TCounter++;
  my $Thread = threads->create(\&Algumacoisa, $Valor01, $Valor02 );
  $Thread->detach();
        
  while ( $TCounter >= $MaxThreads ) {
    print "Aguando liberar threads : $TCounter \n";
    threads->yield();
    sleep 1;
  }
}
while ( $TCounter )
{
    print "\tAguando fim de threads\n";
    sleep 10;
}
sub Algumacoisa {
   my ($valor01, $valor02)  = @_;
# Faça as coisas..
# e ao terminar ...
lock ( $TCounter  );
$TCounter--;
}
</code>
Bom, nesta primeira você viu que o elo fraco está no método 'Algumacoisa', pois se vc sair dele sem diminuir a variável $TCounter, o sistema pode entrar num loop infinito. Para contonar o o problema vc pode colocar timeout no loop.

Uma outra alternativa pode ser algo assim :
<code>
use Thread::Running qw();
use threads;
$MaxThreads = 25;
for ( 1..100 ) {
    my $Thread   = threads->create(\&Algumacoisa, $_ );
    my @Contador = threads->list;
    
    while ( $#Contador >= $MaxThreads ) {
        print "Aguardando liberar as threads $#Contador\n";
        foreach ( threads->list ) {
            if (! $_->running ) {
                print "\t", $_->tid, " is not running\n";
                $_->tojoin;
                pop @Contador;
            }
            else {
                print "\t", $_->tid, " is running\n";
            }
        }
        threads->yield();
        sleep 1;
    }
}
print "Indo para o final !!\n";
foreach ( threads->list ) {
    print "Aguardando thread numero ", $_->tid, "\n";
    $_->join;
}
sub Algumacoisa {
   my ( $valor02 )  = shift;
    # Faça as coisas..
    # e ao terminar ...
    print "Thread de numero $valor02\n";
    sleep 10;
    print "Finalizando a thread de numero $valor02\n";
}
</code>


De:cascavel-pm-bounces em pm.org

Para:cascavel-pm em pm.org

Cópia:

Data:Wed, 31 Aug 2005 00:15:50 -0300

Assunto:[Cascavel-pm] Threads

> olá pessoal
> 
> cá estou eu mais uma vez pedindo a ajuda para um de vocês.
> 
> 
> preciso saber o seguinte:
> 
> como controlar o número de threads ativos?
> ou seja digamos que meu programa tenha o limite de 25 threads
> e assim que um thread fechar eu abra outro ficando sempre com 25 ativos
> alguem sabe me explicar isso ?
> 
> modulos usados:
> 
> use Thread;
> use threads;
> 
> obrigado. 
> 
> 
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20050831/b8cf0c25/attachment.html


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