2015-12-28 14 views
5

Tôi đang cố gắng tìm hiểu Perl 6 và song song/đồng thời cùng một lúc.Cần ví dụ song song đơn giản trong Perl 6

Đối với một bài tập học tập đơn giản, tôi có một thư mục 550 '.htm' tệp và tôi muốn tổng số dòng mã trong số tất cả chúng. Cho đến nay, tôi có điều này:

use v6; 

my $start_time = now; 
my $exception; 
my $total_lines = 0; 

my @files = "c:/testdir".IO.dir(test =>/'.' htm $/); 
for @files -> $file { 
    $total_lines += $file.lines.elems; 
    CATCH { 
     default { $exception = $_; } #some of the files error out for malformed utf-8 
    } 
} 
say $total_lines; 
say now - $start_time; 

Điều đó cho tổng số 577.449 trong khoảng 3 giây.

Làm cách nào để viết lại để tận dụng các ý tưởng song song Perl 6? Tôi nhận ra thời gian được lưu sẽ không nhiều nhưng nó sẽ hoạt động như một bằng chứng về khái niệm.

+3

một cái gì đó như 'tôi $ total_lines = [+] @ files.race.map (* dòng (:. Enc ) .elems)', so với một mà không có '.race'? – Christoph

+0

Tuyệt vời. Với .race mất trung bình khoảng 2 giây. Nếu không có .race, trung bình mất 2,6 giây. – Herby

Trả lời

-1
use v6; 
my $start_time = now; 
my $exception; 
my @lines; 
my $total_lines = 0; 

my @files = "c:/testdir".IO.dir(test =>/'.' htm $/); 
await do for @files -> $file { 
    start { 
     @lines.push($file.lines.elems); 
     CATCH { 
      default { $exception = $_; } #some of the files error out for malformed utf-8 
     } 
    } 
} 
$total_lines = [+] @lines; 
say $total_lines; 
say now - $start_time; 
+1

Cảm ơn. Thật kỳ lạ, khi tôi chạy mã này nhiều lần, tôi nhận được một loạt các $ total_lines. Tôi đã chạy nó 5 lần và có số lượng: 575967, 575367, 570325, 574797, 576222. Bất kỳ ý tưởng nào về những gì đang gây ra điều đó? – Herby

+0

Chưa - Tôi đã nhấn mạnh điều đó từ http://blogs.perl.org/users/pawel_bbkr_pabian/2015/09/asynchronous-parallel-and-dead-my-perl-6-daily-bread.html - và tôi vẫn học cách perl6 hoạt động. Không biết nếu bạn cần bất kỳ hình thức nào của khóa xung quanh cập nhật $ total_lines đó - có thể nếu bạn làm cho khối trả về số lượng các dòng và cộng tổng số bên ngoài của sự chờ đợi. bản đồ/giảm phong cách. –

+0

Ok - tinh chỉnh nó một chút để sử dụng nắm bắt các elems trong mảng được tổng kết bên ngoài của mã song song. –

1

Thực hiện đề xuất của Christoph. Số đếm cao hơn một chút so với bài viết gốc của tôi bởi vì bây giờ tôi có thể đọc trong các tệp UTF-8 không đúng định dạng bằng cách sử dụng mã hóa latin1.

use v6; 
my $start_time = now; 

my @files = "c:/iforms/live".IO.dir(test =>/'.' htm $/); 
my $total_lines = [+] @files.race.map(*.lines(:enc<latin1>).elems); 

say $total_lines; 

say now - $start_time; 
Các vấn đề liên quan