che sto cercando di realizzare il seguente:Perl Code e filettatura
Avere un filo che legge i dati da un file molto grande dire su 10GB e spingerli nella coda. (Non voglio per la coda per ottenere molto grande o)
Mentre il filo
buildQueue
sta spingendo i dati alla coda allo stesso tempo avere discussioni circa 5 di lavoro de-coda e dati di processo.
Ho fatto un tentativo, ma i miei altri thread sono irraggiungibili a causa di un ciclo continuo nel mio buildQueue
thread.
Il mio approccio potrebbe essere completamente sbagliato. Grazie per l'aiuto, è molto apprezzato.
Ecco il codice per 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";
}
}
}
}
E, come ho aspettato quando questa discussione viene eseguito nient'altro dopo verrà eseguito perché questa discussione non finire.
my $builder = new Thread(&buildQueue);
Poiché il thread del builder verrà eseguito per un lungo periodo di tempo, non riesco mai a creare thread di lavoro.
Ecco l'intero codice:
#!/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 paio di domande: si parla che il thread coda-builder non finire, ma fa fare qualcosa? La dimensione della coda non scende mai sotto 100 o supera lo 0? Inoltre, [non sono sicuro che stai creando i tuoi thread correttamente] (http://perldoc.perl.org/perlthrtut.html). Non dovrebbe essere 'my $ builder = threads-> create (\ & buildQueue);'? –
Il programma di creazione coda è adatto ma, poiché i thread di lavoro non sono stati raggiunti per essere creati, non possono rimuovere nulla dalla coda, quindi la coda è bloccata a 100 mentre la coda di build è ancora in esecuzione a causa del ciclo continuo. – Sinista
Hmmm, avrò bisogno di vedere più codice per stabilire il contesto, specialmente dove si creano i thread. Non state 'join'ing o' disconnettete il queue builder prima di creare i thread worker, giusto? –