Julia 1.4.1 中发现的不稳定性:重复的数组构造导致下一个 "print" 或 "println" 调用随机中断
Instability found in Julia 1.4.1: repeated array constructions cause next "print" or "println" call to break at random
在 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",但有时会同时打印。
它也不只是 LinearAlgebra 包。我在使用此代码时遇到了同样的错误(在新的 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")
它只打印了"TWO"。更改 i
的最大值将导致 print
或 println
更频繁地中断。例如,将其设置为 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")
基本上,不时刷新长 运行 作业中的标准输出通常在许多情况下非常有用(例如,您的作业突然被打断,您想知道它何时结束)。
在 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",但有时会同时打印。
它也不只是 LinearAlgebra 包。我在使用此代码时遇到了同样的错误(在新的 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")
它只打印了"TWO"。更改 i
的最大值将导致 print
或 println
更频繁地中断。例如,将其设置为 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")
基本上,不时刷新长 运行 作业中的标准输出通常在许多情况下非常有用(例如,您的作业突然被打断,您想知道它何时结束)。