饲料操作员管道的行为

问题描述 投票:5回答:1

我正在使用以下代码试验Feed运算符:

my $limit=10000000;
my $list=(0,1...4);
sub task($_,$name) {
    say "Start $name on $*THREAD";
    loop ( my $i=0; $i < $limit; $i++ ){};
    say "End $name";
    Nil;
}

sub stage( &code, *@elements --> Seq) {
    map(&code,  @elements);
}

sub feeds() {
    my @results;
    $list
    ==> map ({ task($_, "stage 1"); say( now - ENTER now );$_+1})
    ==> map ({ task($_, "stage 2"); say( now - ENTER now );$_+1})
    ==> stage ({ task($_, "stage 3"); say( now - ENTER now );$_+1}) 
    ==> @results;

    say @results;
}

feeds();
  • task sub只是一个循环来烧掉cpu循环并显示使用的线程
  • stage sub是map sub周围的包装器
  • feed管道的每一步都映射到调用cpu密集型任务并对其进行计时。地图的结果是输入+1

运行时的输出是:

Start stage 1 on Thread<1>(Initial thread)
End stage 1
0.7286811
Start stage 2 on Thread<1>(Initial thread)
End stage 2
0.59053989
Start stage 1 on Thread<1>(Initial thread)
End stage 1
0.5955893
Start stage 2 on Thread<1>(Initial thread)
End stage 2
0.59050998
Start stage 1 on Thread<1>(Initial thread)
End stage 1
0.59472201
Start stage 2 on Thread<1>(Initial thread)
End stage 2
0.5968531
Start stage 1 on Thread<1>(Initial thread)
End stage 1
0.5917188
Start stage 2 on Thread<1>(Initial thread)
End stage 2
0.587358
Start stage 1 on Thread<1>(Initial thread)
End stage 1
0.58689858
Start stage 2 on Thread<1>(Initial thread)
End stage 2
0.59177099
Start stage 3 on Thread<1>(Initial thread)
End stage 3
3.8549498
Start stage 3 on Thread<1>(Initial thread)
End stage 3
3.8560015
Start stage 3 on Thread<1>(Initial thread)
End stage 3
3.77634317
Start stage 3 on Thread<1>(Initial thread)
End stage 3
3.6754558
Start stage 3 on Thread<1>(Initial thread)
End stage 3
3.672909
[3 4 5 6 7]

@result的结果是正确的(来自$list的输入增加3次3次)

前两个阶段的输出拉/交,但第三阶段直到完成阶段2的所有输入才执行

我的map包装器是否存在导致此行为的问题?

此外,在包装器中评估所花费的时间明显长于直接调用map。

任何帮助表示赞赏。

perl6
1个回答
6
投票

slurpy参数正在等待消耗传递给它的整个序列。考虑以下区别:

perl6 -e 'sub foo($) { }; my $items := gather for 1..Inf { say $_ }; foo($items);'
perl6 -e 'sub foo(*@) { }; my $items := gather for 1..Inf { say $_ }; foo($items);'

第一个例子将完成,第二个例子将永远不会完成。因此,您可能希望将舞台功能更改为:

sub stage( &code, $elements --> Seq) {
    map(&code,  $elements);
}
© www.soinside.com 2019 - 2024. All rights reserved.