İlk başta bunu nasıl yapacağımı bilmiyordum, bu yüzden biraz zaman geçirdim.
İşte nesneleri geçmek yazdığı bazı işlevler şunlardır:
sendto
belirtilen işlemlere değişkenlerin isteğe bağlı sayıda gönder.
Belirtilen işlemlerde Ana modülde yeni değişkenler oluşturulur. adı, anahtar kelime bağımsız değişkeninin anahtarı olacaktır ve değer, ilişkili değeri olacaktır.
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
örnekleri # 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
keyfi sürece keyfi bir modülde tanımlanan bir nesne alma. Ana modülün varsayılanları.
Alınacak nesnenin adı bir sembol olmalıdır.
getfrom(p::Int, nm::Symbol; mod=Main) = fetch(@spawnat(p, getfield(mod, nm)))
örnekleri # get an object from named x from Main module on process 2. Name it x
x = getfrom(2, :x)
passobj
işlemleri keyfi bir işlemden nesneleri rasgele sayıda geçirin. Değişken, src işleminin from_mod
modülünde tanımlanmalı ve her bir hedef işlem için aynı ad altında to_mod
modülüne kopyalanacaktır.spencerlyon2 'ın cevabı @ tamamlamak için
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
Örnekler
# 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)
Bu oldukça standart bir istek olması gerektiği gibi görünüyor mu? – bdeonovic
Belgelerinizi okumak için bir öneride bulunabilirsiniz: http://julia.readthedocs.org/en/latest/manual/parallel-computing/ @everywhere makronuzu aradığınız şey nedir? –
Ben dokümanı okudum ve @everywhere bunu yapmaz – bdeonovic