承诺 - 开始 - 等待:输出顺序

7
await返回的值的顺序是否总是与输入顺序相关?
my @aoa = (
    qw<1 a>, qw<2 b>, qw<3 c>,
    qw<4 d>, qw<5 e>, qw<6 f>,
    qw<7 g>, qw<8 h>, qw<9 i>,
);

my @portions = ( ( 0, 2 ), ( 3, 5 ), ( 6, 8 ) );
my @promise;
for @portions -> $range {
    @promise.push: start {
        do for $range[0] .. $range[1] -> $row {
            do for ^@aoa.[$row] -> $col {
                my $str = @aoa[$row][$col] // '';
                $row, $col, $str;
            }
        }
    };
}
for await @promise -> @portion {
    for @portion -> @p_rows {
        say @p_rows.join( ', ' );
    }
}

我猜答案是否定的,但你想要了解什么?或者你想要做什么? - jjmerelo
如果我想填充一个AoA,并且它没有保持原来的顺序,我必须写@AoA[$_[0]][$_[1]] = $_[2]来保持顺序,否则我有更多的选择。 - sid_com
但是你为什么要这样做呢?如果你想在保持顺序的同时加快赋值速度,你可以使用hyper - jjmerelo
我会尝试。 - sid_com
1个回答

5

是的,await 的协程形式被明确设计成可以执行如下操作:

my ($spec, $config) = await start { load-yaml slurp $spec-file },
                            start { from-json slurp $config-file };

无论哪个先完成,都要分配正确的事物。在所提出的情况下 - 将 Promise 推入数组中 - 那么结果顺序将与这些 Promise 的顺序相匹配,即使后面的一个更早地完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接