Others know much more about this area than I do, so hopefully they'll chime in
and correct anything I say that's wrong.
@spawnat (and similar functions) "localize" variables on remote workers by
effectively wrapping them in let blocks. That means that when the command
finishes, the (new) a goes out of scope.
You can achieve what you seem to want this way:
remotecall(2, ()->eval(Main,:(a=5)))
See how the @everywhere macro is defined (in base/multi.jl). You could define a
similar @somewhere (or something) that allows you to evaluate the expression
on a specified process.
But I suspect you can also use RemoteRefs as variables, in which case this
issue presumably won't come up. There's a small illustration of this technique
in the Parallel Computing section of the manual _if_ you select "latest".
(Perhaps that change should be backported to 0.3.)
--Tim
On Thursday, October 30, 2014 11:13:07 AM Kanu Sahai wrote:
> Hello
>
> I am a beginner in Julia and have been trying to build an application in
> it. Although, I am facing a conceptual doubt.
>
> I am working with 4 worker processes on one node.
>
> > addprocs(4)
>
> I define a variable 'a' on all the processes.
>
> julia> @everywhere a=4
>
> Next, I try to modify the value of 'a' at worker#2
>
> julia> @spawnat 2 a=5
> RemoteRef(2,1,16)
>
> julia> fetch(ans)
> 5
>
> Now, if I print the value of 'a' at all processors, I get :
>
> julia> @everywhere println(a)
> 4
> From worker 2: 4
> From worker 4: 4
> From worker 5: 4
> From worker 3: 4
>
> Why is the modified value of 'a' not reflected here ? Am I missing
> something in the logic ?
>
> Thanks so much!