I am trying to port the following Notebook to Julia 1.0:
I am stock on the following point:
@everywhere println(myid())
Julia 0.7 warns me with:
WARNING: Base.@everywhere is deprecated: it has been moved to the standard library package Distributed.
Add using Distributed to your imports.
But even if I do that I still have the warning (of course I did try Distributed.@everywhere, but it doesn’t seems to be the right syntax).
Which is the right syntax to use a macro that resides within a package ?
Have you restarted the session? Once used, the binding to @everywhere still points to the old binding and thus you still get the deprecation warning. After a reload and fresh using, it will point to the package.
An other “strange” behaviour… I updated the code for Julia 1.0 with
using BenchmarkTools, Distributed, LinearAlgebra
D = Distributed
LA = LinearAlgebra
I can then use D instead of typing everytime Distributed, but on this line I still need to use Distributed. If I use D it returns me an error UndefVarError: D not defined:
D.@everywhere println(Distributed.myid())
hmmm… let me guess… the macro @everywhere in the Distributed package creates a scope that isolate me from the rest of my script ? But so it means I can’t access global variables from the macro ?
No, it’s because D is not defined on your other worker processes (see here):
julia> using Distributed
julia> D = Distributed
Distributed
julia> nprocs()
2
julia> @everywhere println(myid())
1
From worker 2: 2
julia> @everywhere println(D.myid())
1
ERROR: On worker 2:
UndefVarError: D not defined
#<snip>
julia> @everywhere D = Distributed
julia> @everywhere println(D.myid())
1
From worker 2: 2
Note the error, it specifies where the error happened - in this case on worker 2. The first call to myid() succeeds because I started julia with julia -p 1, which creates a worker process and implicitly loads the Distributed package on all workers.