Perl Queues and Threading

Я пытаюсь выполнить следующее:

  1. Пусть поток, который читает данные из очень большого файла, скажет о 10GB и запихиваем их в очередь.(Я не хочу, чтобы очередь становятся очень большими)

  2. Пока поток buildQueue помещает данные в очередь, в то же время около 5 рабочих потоков удаляют очередь и обрабатывают данные.

Я предпринял попытку, но другие мои потоки недоступны из-за непрерывного цикла в моем потоке buildQueue .

Мой подход может быть совершенно неправильным. Спасибо за любую помощь, это очень ценно.

Вот код для 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";
            }
        }
    }
}

И, как я ожидал, когда этот поток будет выполнен, больше ничего не будет выполнено, потому что этот поток не завершится.

my $builder = new Thread(&buildQueue);

Поскольку поток построителя будет работать долгое время, мне никогда не удастся создать рабочие потоки.

Вот весь код:

#!/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;
8
задан Sinista 13 February 2012 в 12:32
поделиться