快速提问:在 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 循环内的某处。将其视为基本演示。然而,只要有可能,通常都会避免锁定。更好的解决方案是使用
Channel
和 react/whenever
块。
关于arrays - perl6 在循环遍历数组时修改数组的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53856578/