estoy tratando de lograr lo siguiente:Perl colas y con hilo
tener un hilo que lee datos de un archivo muy grande decir sobre 10GB y empujarlos en la cola. (No deseo para la cola a ser muy grandes tampoco)
Mientras que el hilo
buildQueue
está empujando a la cola de datos al mismo tiempo, tener hilos alrededor del 5 trabajadores los datos del proceso de-cola y.
he hecho un intento pero mis otros hilos son inalcanzables debido a un bucle continuo en mi buildQueue
hilo.
Mi enfoque puede ser totalmente incorrecto. Gracias por cualquier ayuda, es muy apreciado.
Aquí está el código para buildQueue
:
sub buildQueue {
print "Enter a file name: ";
my $dict_path = <STDIN>;
chomp($dict_path);
open DICT_FILE, $dict_path or die("Sorry, could not open file!");
while (1) {
if (<DICT_FILE>) {
if ($queue->pending() < 100) {
my $query = <DICT_FILE>;
chomp($query);
$queue->enqueue($query);
my $count = $queue->pending();
print "Queue Size: $count Query: $query\n";
}
}
}
}
Y como he esperado cuando este hilo es ejecutado nada más después se ejecutará porque este hilo no va a terminar.
my $builder = new Thread(&buildQueue);
Dado que el hilo del constructor estará en funcionamiento durante mucho tiempo, nunca consigo crear subprocesos de trabajo.
Aquí está el código completo:
#!/usr/bin/perl -w
use strict;
use Thread;
use Thread::Queue;
my $queue = new Thread::Queue();
my @threads;
sub buildQueue {
print "Enter a file name: ";
my $dict_path = <STDIN>;
chomp($dict_path);
open dict_file, $dict_path or die("Sorry, could not open file!");
while (1) {
if (<dict_file>) {
if ($queue->pending() < 100) {
my $query = <dict_file>;
chomp($query);
$queue->enqueue($query);
my $count = $queue->pending();
print "Queue Size: $count Query: $query\n";
}
}
}
}
sub processor {
my $query;
while (1) {
if ($query = $queue->dequeue) {
print "$query\n";
}
}
}
my $builder = new Thread(&buildQueue);
push @threads, new Thread(&processor) for 1..5;
Un par de preguntas: Usted menciona que el hilo de cola-constructor no va a terminar, pero es lo que hace nada en absoluto? ¿Alguna vez el tamaño de la cola cae por debajo de 100 o va por encima de 0? Además, [no estoy seguro de que estés creando tus hilos correctamente] (http://perldoc.perl.org/perlthrtut.html). ¿No debería ser 'my $ builder = threads-> create (\ & buildQueue);'? –
El generador de colas se compila bien, pero dado que no se llegó a crear subprocesos de trabajo, no se puede eliminar nada de la cola, por lo que la cola está bloqueada en 100 mientras la cola de compilación continúa ejecutándose debido al bucle continuo. – Sinista
Hmmm, necesitaré ver más código para establecer el contexto, especialmente donde crea los hilos. No está 'join'ing o' detach'ing the queue builder antes de crear los hilos de trabajo, ¿verdad? –