BAR
BAR

Reputation: 17151

Julia - Linearly Parallelize

Julia can parallelize threads but doesn't run them in order (i.e. from 1 to 10 in order). Is there anyway to have julia run them linearly with a defined max parallelism? Maybe by pulling from a queue?

julia> Threads.@threads for i = 1:10
           println("i = $i on thread $(Threads.threadid())")
       end
i = 1 on thread 1
i = 7 on thread 3
i = 2 on thread 1
i = 8 on thread 3
i = 3 on thread 1
i = 9 on thread 4
i = 10 on thread 4
i = 4 on thread 2
i = 5 on thread 2
i = 6 on thread 2

Upvotes: 1

Views: 52

Answers (1)

xiaodai
xiaodai

Reputation: 16064

You can start threads in order using @spawn but there is no guarantee that they will finish in order, which I think is what you are looking for.

But if you must, you could send the results to a central place which will make it print sequentially.

c = Channel(10)

function channel_printer(c)
    res = []
    for i in 1:10
        push!(res, take!(c))
    end

    sort!(res, by=first)

    for (_, r) in res
        println(r)
    end
end

Threads.@threads for i = 1:10
    #println("i = $i on thread $(Threads.threadid())")
    str = "i = $i on thread $(Threads.threadid())"
    put!(c, (i, str))
end

channel_printer(c)

Note, the code is definitely not efficient by is meant to illustrate the idea.

Upvotes: 1

Related Questions