在 Julia 1.4.1 中发现的不稳定性:重复的数组构造导致下一个"print"或"println"调用随机中断



在 Julia 1.4.1 (2020-04-14( 中发现的不稳定性。(JuliaPro,64位Windows 10,在Juno中(。

3 小时后,我隔离了一些最小的工作示例:

using LinearAlgebra
for i in 1:5000000
[1 2 3; 2 3 4; 3 4 5]
end
print("ONE")
print("TWO")

有时"ONE"会打印,有时"ONETWO"会打印,在重复运行相同的代码块后。稍微更改代码仍然有效 - 例如:

using LinearAlgebra
for i in 1:1000000
ones(2,2)-I
end
println("ONE")
println("TWO")

这通常只会打印"TWO",但有时同时打印两者。

它不仅仅是线性代数包。我在使用此代码时遇到了相同的错误(在新的 Juno 会话中(:

for i in 1:10000000
[1 1 1; 2 3 4; 1 1 1]
end
println("ONE")
println("TWO")

有了这个代码:

for i in 1:100000000
[1]
end
println("ONE")
println("TWO")

它只印了"两个"。更改最大值i将导致更频繁地中断printprintln。例如,将其设置为 50,000 后,可能需要调用 20 次循环才能只看到"TWO"而不是"ONETWO",但将其设置为 100,000,000 它几乎每次都有效。我还注意到,使用ones(x,x)更容易导致错误。不一致是整个事情中最奇怪的部分。

我还没有测试过不同版本的 Julia,因为该网站在过去几个小时里一直给我带来麻烦,但知道为什么会发生这种情况以及它是否发生在其他人身上会非常有趣。

我设法复制了这种行为。这看起来像是 Juno 中的缓冲问题。我想你可以把它作为一个错误提交。

同时,只需使用flush(stdout)刷新标准输出,例如:

for i in 1:10000000
[1 1 1; 2 3 4; 1 1 1]
end
flush(stdout)
println("ONE")
println("TWO")

基本上,在许多情况下,在长时间运行的作业中不时刷新标准输出通常非常有用(例如,您的作业突然中断,您想知道它何时结束(。

最新更新