Parallel processing julia中while循环中的打印(“打印”)效果

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

我在朱莉娅身上遇到了一个奇怪的错误。本质上,在某个地方添加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
    # 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提供了这一点。我很快会发布答案。