perl6遍历数组时修改数组的一般方法

时间:2018-12-19 17:40:19

标签: arrays loops perl6

快速问题:在Perl6(相对于Perl5或其他语言)中,在修改数组时循环访问是否安全?例如,如果我要下载一系列网站,并且将失败的下载添加到该阵列的末尾以重新下载,perl6的行为是否会符合预期? (我大约有5万个链接可供下载,要进行全部测试会很费时间。)

如果不安全,一般的方法是什么?我一直在考虑将中断下载的链接存储在另一个数组中,并在完成原始数组后遍历该数组。但是,这就像狐狸追尾一样,因为我必须将失败的下载存储在另一个阵列中(或覆盖原始阵列)。

非常感谢您!

lisprog

1 个答案:

答案 0 :(得分:6)

在单线程环境中绝对安全:

my @a = ^5;
for @a { 
    @a.push: $_ + 10 if $_ < 30
}
say @a
  

[1 2 3 4 11 12 13 14 21 22 23 24 31 32 33 34]

在多线程环境(最好在您的任务中使用)中,任何事情都是理所当然的。因此,最好将新元素添加到数组中,然后包装到Lock中:

my @a = ^5;
my Lock $l .= new;
for @a {
    start {
        ... # Do your work here 
        $l.protect: {
            @a.push: $_ with $site
        }
    }
}
say @a

请注意,最后一个示例将无法按预期方式工作,因为所有start ed线程必须在循环内的某个地方await ed。将其视为基本演示。

但是,通常尽可能避免锁定。更好的解决方案是使用Channelreact/whenever块。