Parallel processing julia中while循环中的打印(“打印”)效果
我在朱莉娅身上遇到了一个奇怪的错误。本质上,在某个地方添加print(“”)语句会明智地改变以下代码的行为(以积极的方式)。我很困惑。为什么?Parallel processing julia中while循环中的打印(“打印”)效果,parallel-processing,julia,Parallel Processing,Julia,我在朱莉娅身上遇到了一个奇怪的错误。本质上,在某个地方添加print(“”)语句会明智地改变以下代码的行为(以积极的方式)。我很困惑。为什么? xs = [1,2,3,4,5,6,7,8] cmds = [`sleep $x` for x in xs] f = open("results.txt", "w") i = 1 nb_cmds = length(cmds) max_running_ps = 3 nb_running_ps = 0 ps = Dict() while true
xs = [1,2,3,4,5,6,7,8]
cmds = [`sleep $x` for x in xs]
f = open("results.txt", "w")
i = 1
nb_cmds = length(cmds)
max_running_ps = 3
nb_running_ps = 0
ps = Dict()
while true
# launching new processes if possible
if nb_running_ps < max_running_ps
if i <= nb_cmds && !(i in keys(ps))
print("spawn:")
println(i)
p = spawn(cmds[i], Base.DevNull, f, f)
setindex!(ps,p,i)
nb_running_ps = nb_running_ps + 1
i = i+1
end
end
# detecting finished processes to be able to launch new ones
for j in keys(ps)
if process_exited(ps[j])
print("endof:")
println(j)
delete!(ps,j)
nb_running_ps = nb_running_ps - 1
else
print("")
# why do I need that ????
end
end
# nothing runs and there is nothing to run
if nb_running_ps <= 0 && i > nb_cmds
break
end
end
close(f)
println("finished")
xs=[1,2,3,4,5,6,7,8]
cmds=[`sleep$x`for x in xs]
f=打开(“results.txt”、“w”)
i=1
nb_cmds=长度(cmds)
最大运行压力=3
nb_运行_ps=0
ps=Dict()
虽然是真的
#如有可能,启动新流程
如果nb\u运行\u ps<最大运行\u ps
如果我这不是一个bug,尽管如果您不习惯这种异步编程可能会感到惊讶
Julia默认为单线程,一次只运行一个任务。为了完成一项任务,朱莉娅需要切换到它。只要当前任务产生,任务就会切换
print
也是一种异步操作,因此它将为您提供收益,但一种更简单的方法是yield()
,它可以获得相同的结果。有关异步编程的更多信息,请参阅。print
is(出于性能原因)和yields。也许可以试试@sync print(“”
?如果这解决了你的问题,那么我将把它作为一个答案发布。事实上,我的问题已经通过添加打印(“”)来“解决”(即使没有@sync)。但是,我不明白为什么,因此我提出了我的问题。那么,您的问题正好相反:您需要异步行为(因此可以发生任务切换),而print提供了这一点。我很快会发布答案。