Ich wusste nicht, wie ich das zuerst machen sollte, also verbrachte ich einige Zeit damit, es herauszufinden.
Hier sind einige Funktionen, die ich schrieb Objekte weitergeben müssen:
sendto
eine beliebige Anzahl von Variablen auf bestimmte Prozesse senden.
Neue Variablen werden im Hauptmodul für bestimmte Prozesse erstellt. Der Name ist der Schlüssel des Schlüsselwortarguments und der Wert ist der zugehörige Wert .
function sendto(p::Int; args...)
for (nm, val) in args
@spawnat(p, eval(Main, Expr(:(=), nm, val)))
end
end
function sendto(ps::Vector{Int}; args...)
for p in ps
sendto(p; args...)
end
end
Beispiele
# creates an integer x and Matrix y on processes 1 and 2
sendto([1, 2], x=100, y=rand(2, 3))
# create a variable here, then send it everywhere else
z = randn(10, 10); sendto(workers(), z=z)
getfrom
ein Objekt in einem beliebigen Modul auf einem beliebigen Prozess definiert Abrufen. Standardmäßig auf das Hauptmodul eingestellt.
Der Name des abzurufenden Objekts sollte ein Symbol sein.
getfrom(p::Int, nm::Symbol; mod=Main) = fetch(@spawnat(p, getfield(mod, nm)))
Beispiele
# get an object from named x from Main module on process 2. Name it x
x = getfrom(2, :x)
passobj
Pass, eine beliebige Anzahl von Objekten von einem Prozess Prozesse beliebig. Die Variable muss im Modul from_mod
des Prozesses src definiert sein und wird unter demselben Namen in das Modul to_mod
für jeden Zielprozess kopiert.
function passobj(src::Int, target::Vector{Int}, nm::Symbol;
from_mod=Main, to_mod=Main)
r = RemoteRef(src)
@spawnat(src, put!(r, getfield(from_mod, nm)))
for to in target
@spawnat(to, eval(to_mod, Expr(:(=), nm, fetch(r))))
end
nothing
end
function passobj(src::Int, target::Int, nm::Symbol; from_mod=Main, to_mod=Main)
passobj(src, [target], nm; from_mod=from_mod, to_mod=to_mod)
end
function passobj(src::Int, target, nms::Vector{Symbol};
from_mod=Main, to_mod=Main)
for nm in nms
passobj(src, target, nm; from_mod=from_mod, to_mod=to_mod)
end
end
Beispiele
# pass variable named x from process 2 to all other processes
passobj(2, filter(x->x!=2, procs()), :x)
# pass variables t, u, v from process 3 to process 1
passobj(3, 1, [:t, :u, :v])
# Pass a variable from the `Foo` module on process 1 to Main on workers
passobj(1, workers(), [:foo]; from_mod=Foo)
Dies scheint, als sollte es eine ziemlich standard Anfrage sein nein? – bdeonovic
Vielleicht erhalten Sie einen Vorschlag, um die Dokumentation zu lesen: http://julia.readthedocs.org/en/latest/manual/parallel-computing/ Ist das @ Everywhere-Makro, was Sie suchen? –
Ich habe das Dokument gelesen und kein @everywhere macht das nicht – bdeonovic