arrays - perl6 在循环遍历数组时修改数组的一般方法

标签 arrays loops raku

快速提问:在 Perl6(相对于 perl5 或其他语言)修改数组时循环遍历数组是否安全?例如,如果我有一系列网站要下载,并且我将失败的下载添加到阵列的末尾以重新下载,perl6 会按预期运行吗? (我有大约 5 万个链接要下载,尝试全部测试会很耗时。)

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

非常感谢 !!!

lisprog

最佳答案

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

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块。

关于arrays - perl6 在循环遍历数组时修改数组的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53856578/

相关文章:

python - python中三对角矩阵的解是什么?

arrays - 如何从 json 中删除空数组。我数组中没有元素,我想删除数组。它的嵌套数组

java - 使用 for 循环创建对象

dynamic - 如何动态创建捕获 (Raku)

javascript - 在javascript中将JSON对象添加到多维数组

c - 为什么我的数组中有我没有分配的值?

loops - 在 VHDL 中使用带有变量的 FOR 循环

C 枚举数组(需要帮助理解)

operator-overloading - 类的重载运算符

jvm - Parrot 与其他虚拟机相比如何?