2016-11-03 4 views
1

Ich versuche, ein einfaches Programm zu schreiben, um parallele Verarbeitung mit Code in separaten Modulen zu tun. Ich habe den folgenden Code in zwei separaten Dateien:Julia parallele Verarbeitung in separaten Modulen

main.jl

push!(LOAD_PATH, ".") 

#using other # This doesn't work either 

importall other 

np = 4 
b = [Bounds(k, k+8) for k in 1:np] 
fut = Array{Future}(np) 

for k = 1:np 
    fut[k] = @spawn center(b[k]) 
end 

for k = 1:np 
    xc = fetch(fut[k]) 
    println("Center for k ", k, " is ", xc) 
end 

other.jl

@everywhere module other 

export Bounds 
export center 

@everywhere type Bounds 
    x1::Int 
    x2::Int 
end 

@everywhere function center(bound::Bounds) 
    return (bound.x1 + bound.x2)/2 
end 

end 

Wenn ich mit „julia Haupt mit einem einzigen Prozess ausgeführt werden. jl "es läuft ohne Fehler, aber wenn ich versuche, Prozesse mit" julia -p4 main.jl "hinzuzufügen, erhalte ich den Fehler unten. Es sieht so aus, als könnten die zusätzlichen Prozesse den Code in other.jl nicht sehen, aber ich habe das @ everywhere-Makro an den richtigen Stellen. Was ist das Problem? Dies wird geladen other auf alle aktuellen Arbeiter

ERROR: LoadError: LoadError: On worker 2: 
UndefVarError: ##5#7 not defined 
in deserialize_datatype at ./serialize.jl:823 
in handle_deserialize at ./serialize.jl:571 
in deserialize_msg at ./multi.jl:120 
in message_handler_loop at ./multi.jl:1317 
in process_tcp_streams at ./multi.jl:1276 
in #618 at ./event.jl:68 
in #remotecall_fetch#606(::Array{Any,1}, ::Function, ::Function, ::Base.Worker) at ./multi.jl:1070 
in remotecall_fetch(::Function, ::Base.Worker) at ./multi.jl:1062 
in #remotecall_fetch#609(::Array{Any,1}, ::Function, ::Function, ::Int64) at ./multi.jl:1080 
in remotecall_fetch(::Function, ::Int64) at ./multi.jl:1080 
in (::other.##6#8)() at ./multi.jl:1959 

...and 3 other exceptions. 

in sync_end() at ./task.jl:311 
in macro expansion; at ./multi.jl:1968 [inlined] 
in anonymous at ./<missing>:? 
in eval(::Module, ::Any) at ./boot.jl:234 
in (::##1#3)() at ./multi.jl:1957 
in sync_end() at ./task.jl:311 
in macro expansion; at ./multi.jl:1968 [inlined] 
in anonymous at ./<missing>:? 
in include_from_node1(::String) at ./loading.jl:488 
in eval(::Module, ::Any) at ./boot.jl:234 
in require(::Symbol) at ./loading.jl:409 
in include_from_node1(::String) at ./loading.jl:488 
in process_options(::Base.JLOptions) at ./client.jl:262 
in _start() at ./client.jl:318 
while loading /mnt/mint320/home/bmaier/BillHome/Programs/Julia/parallel/modules/other.jl, in expression starting on line 1 
while loading /mnt/mint320/home/bmaier/BillHome/Programs/Julia/parallel/modules/main.jl, in expression starting on line 5 
+0

Sie müssen "@ Everywhere importierenall andere" in main.jl und Sie brauchen nicht das @ überall in anderen. Jl –

+1

Danke, das hat funktioniert! Ich hätte nicht gedacht, dass ich es bei der wichtigen Aussage brauchte. – ciric50

Antwort

1

@everywhere importall other in main.jl

Versuchen. Es gibt keine Anforderung für other etwas anderes als ein normales Skript oder Modul zu sein, und so brauchen Sie nicht die @everywhere in anderen.jl.

Verwandte Themen