2015-12-28 3 views
5

Я пытаюсь одновременно изучить Perl 6 и параллелизм/параллелизм.Нужно простой пример параллелизма в Perl 6

Для простого обучения у меня есть папка с файлами 550 '.htm', и я хочу, чтобы общая сумма строк кода среди всех из них. До сих пор у меня есть следующее:

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; 

Это дает сумму 577 449 примерно за 3 секунды.

Как бы переписать это, чтобы использовать идеи параллелизма Perl 6? Я понимаю, что спасенное время не будет много, но оно будет служить доказательством концепции.

+3

что-то вроде 'мои $ total_lines = [+] @ files.race.map (* линий (:. ENC ) .elems)', по сравнению с той, без '.race'? – Christoph

+0

Отлично. С .race это заняло приблизительно 2 секунды в среднем. Без .race, в среднем он занимает 2,6 секунды. – Herby

ответ

-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

Спасибо. Странно, когда я запускаю этот код несколько раз, я получаю множество $ total_lines. Я побежал его 5 раз и получил подсчет: 575967, 575367, 570325, 574797, 576222. Любые идеи относительно того, что вызывает это? – Herby

+0

Пока нет - я просмотрел это с http://blogs.perl.org/users/pawel_bbkr_pabian/2015/09/asynchronous-parallel-and-dead-my-perl-6-daily-bread.html - и я все еще изучая, как все работает. Не знаю, нужна ли вам какая-либо форма блокировки в этом обновлении $ total_lines - может быть, если вы сделаете блок, возвращаете количество строк и суммируете суммы за пределами ожидаемого. map/уменьшить стиль. –

+0

ОК - немного поправился, чтобы использовать захват элем в массиве, который суммируется за пределами параллельного кода. –

1

Реализация предложения Кристофа. Счет немного выше моего исходного сообщения, потому что теперь я могу читать в искаженных файлах UTF-8, используя encode 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;