Reduce.jl icon indicating copy to clipboard operation
Reduce.jl copied to clipboard

Asynchronous concurrency gets Reduce confused

Open dstahlke opened this issue 3 years ago • 2 comments

The following test works. But take out the Semaphore and it hangs and/or scrambles the results. Perhaps Reduce.jl should be using a semaphore/mutex internally? This problem arose when I was using Reduce.jl with Genie.jl, and it caused some hard to debug problems, such as one HTTP request hanging until the next request came in, or having rcall return the result from someone else's query.

using Reduce

reduce_sem = Base.Semaphore(1)

println("create")
tasks = []
for i in 1:10
    t = @task begin
        println("begin $i")
        Base.acquire(reduce_sem)
        println("rcall $i")
        y = :($i * x) |> rcall
        println("$i -> $y")
        Base.release(reduce_sem)
        println("released")
    end
    push!(tasks, t)
end

println("schedule")
for t in tasks
    schedule(t)
end

println("wait")
for t in tasks
    wait(t)
end

dstahlke avatar Jul 05 '21 17:07 dstahlke

Thanks for the interest in my project, I don't currently have time to look into this issue as it's not relevant to my own usage.

If you'd like me to look into it further, please consider sponsoring me to work on this issue and provide more details.

chakravala avatar Jul 05 '21 17:07 chakravala

For now the Semaphore workaround works for me. Perhaps I will one day find time to find a fix and send you a pull request.

dstahlke avatar Jul 05 '21 17:07 dstahlke