Thanks for your reply.
In my view it is natural, that the order of the "output" (print statements)
> is intermingled, as the code runs in parallel.
Yes, I agree. But I'd like to make sure we're talking about the same level
of intermingledness (is this a new word?)
Firstly I don't really understand parallel processing, output streams,
switching etc.
But when I first starting using Julia for parallel sims (Julia v0.3) I was
initially surprised that output from each worker was NOT intermingled, in
the sense that each print statement from a worker was delivered to the
master process console "atomically". i.e. there were discreet lines on the
console each wholly from a single worker.
Sure, the order of the lines depended on the speed of the processor, the
amount of work to do etc.
After a while, I just assumed this was either magic, or there was some kind
of queuing system with locking or similar.
In any case, I didn't really think about it until I started using Julia
v0.4 where output lines are sometimes not discrete and sometimes delayed.
Here's an example of output:
...
From worker 3: Completed random trial 69
From worker 3: Starting random trial 86 with 100 games
From worker 5: Starting random trial 87 with 100 games
From worker 2: Completed random trial 70
From worker 2: Starting random trial 88 with 100 games
From worker 27: Starting random trial 89 with 100 games
From worker 21: Completed random trial From worker 22: Starting
random trial 90 with 100 games
From worker 23: Starting random trial 93 with 100 games
From worker 21: 81
From worker 19: Starting random trial 91 with 100 games
From worker 14: Starting random trial 96 with 100 games
From worker 4: Completed random trial 82
From worker 4: Starting random trial 98 with 100 games
From worker 24: Completed random trial From worker 26: Completed
random trial 76
From worker 25: Completed random trial 80
From worker 24: 85
From worker 22: Completed random trial 90
From worker 3: Completed random trial 86
From worker 8: Completed random trial From worker 9: Starting
random trial 94 with 100 games
From worker 8: 78
From worker 3: Starting random trial 99 with 100 games
From worker 27: Completed random trial From worker 29: Starting
random trial 92 with 100 games
From worker 28: Starting random trial 95 with 100 games
From worker 27: 89
From worker 2: Completed random trial 88
From worker 2: Starting random trial 100 with 100 games
From worker 23: Completed random trial 93
From worker 29: Completed random trial 92
From worker 28: Completed random trial 95
From worker 14: Completed random trial From worker 16: Completed
random trial 72
From worker 15: Completed random trial 75
From worker 20: Completed random trial 79
From worker 17: Completed random trial 83
From worker 18: Completed random trial 84
From worker 19: Completed random trial 91
From worker 14: 96
From worker 4: Completed random trial 98
From worker 9: Completed random trial 94
From worker 3: Completed random trial 99
From worker 10: Completed random trial From worker 11: Completed
random trial 65
From worker 12: Completed random trial 66
From worker 13: Completed random trial 71
From worker 10: 77 From worker 11: Starting random trial 97 with
100 games
From worker 10:
From worker 2: Completed random trial 100
From worker 5: Completed random trial From worker 6: Completed
random trial 73
From worker 7: Completed random trial 74
From worker 5: 87
From worker 11: Completed random trial 97
Again I have no idea how these thing work, but here's code from Julia v0.3
(multi.jl)
if isa(stream, AsyncStream)
let wrker = w
# redirect console output from workers to the client's stdout:
@async begin
while !eof(stream)
line = readline(stream)
print("\tFrom worker $(wrker.id):\t$line")
end
end
end
end
And equivalent code from Julia v0.4:
function redirect_worker_output(ident, stream)
@schedule while !eof(stream)
line = readline(stream)
if startswith(line, "\tFrom worker ")
# STDOUT's of "additional" workers started from an initial
worker on a host are not available
# on the master directly - they are routed via the initial
worker's STDOUT.
print(line)
else
print("\tFrom worker $(ident):\t$line")
end
end
end
It seems we've gone from @async to @schedule.
Would this make a difference?