快速问题:在Perl6(相对于Perl5或其他语言)中,在修改数组时循环访问是否安全?例如,如果我要下载一系列网站,并且将失败的下载添加到该阵列的末尾以重新下载,perl6的行为是否会符合预期? (我大约有5万个链接可供下载,要进行全部测试会很费时间。)
如果不安全,一般的方法是什么?我一直在考虑将中断下载的链接存储在另一个数组中,并在完成原始数组后遍历该数组。但是,这就像狐狸追尾一样,因为我必须将失败的下载存储在另一个阵列中(或覆盖原始阵列)。
非常感谢您!
lisprog
答案 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。将其视为基本演示。
但是,通常尽可能避免锁定。更好的解决方案是使用Channel
和react/whenever
块。