Tôi đang cố gắng để thực hiện những điều sau:Perl Queues và Threading
Có một sợi mà đọc dữ liệu từ một tập tin rất lớn nói về 10GB và đẩy chúng vào hàng đợi. (Tôi không muốn cho hàng đợi để nhận được rất lớn hoặc)
Trong khi thread
buildQueue
đang đẩy dữ liệu vào hàng đợi cùng một lúc có đề khoảng 5 công nhân bỏ hàng đợi và xử lý dữ liệu.
Tôi đã cố gắng nhưng các chủ đề khác của tôi không thể truy cập được do vòng lặp liên tục trong chuỗi buildQueue
của tôi.
Cách tiếp cận của tôi có thể hoàn toàn sai. Cảm ơn bạn đã giúp đỡ, nó được nhiều đánh giá cao.
Dưới đây là các mã cho 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";
}
}
}
}
Và như tôi đã mong đợi khi chủ đề này được thực hiện không có gì khác sau sẽ được thực hiện bởi vì chủ đề này sẽ không hoàn thành.
my $builder = new Thread(&buildQueue);
Vì chuỗi trình tạo sẽ chạy trong một thời gian dài, tôi không bao giờ tạo chuỗi công việc.
Dưới đây là toàn bộ mã:
#!/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;
Một vài câu hỏi: Bạn đề cập đến chuỗi chủ đề xây dựng hàng đợi của bạn sẽ không kết thúc, nhưng nó có làm gì không? Kích thước hàng đợi có giảm dưới 100 hay cao hơn 0 không? Ngoài ra, [Tôi không chắc bạn đang tạo chủ đề của mình một cách chính xác] (http://perldoc.perl.org/perlthrtut.html). Không phải nó là 'my $ builder = threads-> create (\ & buildQueue);'? –
Công cụ xây dựng hàng đợi được xây dựng tốt nhưng do chuỗi công nhân không đạt được nên chúng không thể xóa bất kỳ thứ gì từ hàng đợi sao cho hàng đợi bị kẹt ở mức 100 trong khi hàng đợi xây dựng vẫn chạy vì vòng lặp liên tục. – Sinista
Hmmm, tôi sẽ cần phải xem thêm mã để thiết lập ngữ cảnh, đặc biệt là nơi bạn tạo chủ đề. Bạn không phải là 'join'ing hoặc' detach'ing builder queue trước khi tạo các threads worker, đúng không? –