2011-06-03 7 views
5

Estoy aprendiendo el multihilo de Perl. Mi código:¿Por qué esta impresión 12 veces?

use warnings; 
use threads; 
use threads::shared; 

$howmany = 10; 
$threads = 5; 

$to = int($howmany/$threads); 

for (0 .. $threads) {$trl[$_] = threads->create(\&main, $_);} 
for (@trl) {$_->join;} 

sub main { 
    for (1 .. $to) { 
     print "test\n"; 
    } 
} 

exit(0); 

Quiero imprimir la palabra prueba$howmany veces en $threads hilos. Este código imprime prueba 12 veces. ¿Dónde está el problema?

Respuesta

10

entonces pienso que deseas for (0..$threads-1) o for (1..$threads), no for (0..$threads)

:-)

+0

Exactamente! Tengo unas horas que no puedo entender el problema. Muchas gracias. – Anton

3
for(0..$threads) 

carreras veces: 0,1,2,3,4,5

11

¿Puedo sugerir un enfoque alternativo?

use strict; 
use warnings; 

use threads  ;#qw(async); 
use Thread::Queue qw(); 

my $num_workers = 5; 
my $num_work_units = 10; 

my $q = Thread::Queue->new(); 

# Create workers 
my @workers; 
for (1..$num_workers) { 
    push @workers, async { 
     while (defined(my $unit = $q->dequeue())) { 
     print("$unit\n"); 
     } 
    }; 
} 

# Create work 
for (1..$num_work_units) { 
    $q->enqueue($_); 
} 

# Tell workers they are no longer needed. 
$q->enqueue(undef) for @workers; 

# Wait for workers to end 
$_->join() for @workers; 

Ventajas:

  • Más escalable
  • funciona incluso si num_work_units $/$ num_workers no es un entero.
  • No asume que todas las unidades de trabajo tardan el mismo tiempo en completarse.

Salida:

1 
5 
2 
8 
9 
10 
7 
3 
4 
6 
+0

Thread :: Queue se ve genial. Gracias por el puntero. – daotoad

Cuestiones relacionadas