Próbuję wykonać następujące czynności:Perl Kolejki i Threading
mają gwint, który odczytuje dane z bardzo dużego pliku powiedzieć o 10GB i odsyła je do kolejki. (Nie chcę za kolejce do uzyskać bardzo duże albo)
Choć wątek
buildQueue
naciska dane do kolejki w tym samym czasie mają około 5 pracownika nici de-kolejkę i przetwarzania danych.
Zrobiłem próbę ale moje inne wątki są nieosiągalne z powodu pętli w moim buildQueue
wątku.
Moje podejście może być całkowicie błędne. Dzięki za pomoc, jest to bardzo doceniane.
Oto kod dla 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";
}
}
}
}
A jak już spodziewać, kiedy ten wątek zostaje nic innego wykonywane po zostanie wykonany, ponieważ ten wątek nie zakończy.
my $builder = new Thread(&buildQueue);
Ponieważ wątek budowniczego będzie działał przez długi czas, nigdy nie utworzę wątków roboczych.
Oto cały kod:
#!/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;
Kilka pytań: Możesz wspomnieć, że gwint kolejka-budowniczy nie zakończy, ale to niczego w ogóle? Czy rozmiar kolejki spadł poniżej 100 lub przekroczył 0? Ponadto [nie jestem pewien, czy poprawnie tworzysz swoje wątki] (http://perldoc.perl.org/perlthrtut.html). Czy nie powinno to być 'my $ builder = threads-> create (\ & buildQueue);'? –
Kreator kolejki jest dobrze zbudowany, ale ponieważ wątki robocze nie zostały utworzone, nie można usunąć niczego z kolejki, więc kolejka zatrzyma się na 100, podczas gdy kolejka kompilacji nadal działa z powodu ciągłej pętli. – Sinista
Hmmm, będę potrzebował zobaczyć więcej kodu, aby ustalić kontekst, szczególnie tam, gdzie tworzysz wątki. Nie jesteś 'join'ing lub' odłączyć 'budowniczego kolejki przed utworzeniem wątków roboczych, prawda? –