#julia
Вопрос:
function pass_object(src::Int, target::Vector{Int8}, name::Symbol; from_mod=Main, to_mod=Main)
r = RemoteChannel(src)
@sync @spawnat(src, put!(r, getfield(from_mod, name)))
@sync for to in target
@spawnat(to, Core.eval(to_mod, Expr(:(=), name, fetch(r))))
end
end
variable1 = some_data
@sync pass_object(1, pid, :variable1)
result = @spawnat pid Core.eval(Main, :(new_variable=variable1))
Джулия 1.5.3
Я перепробовал несколько способов передачи объекта другому работнику, а затем использовал назначенную переменную, но в результате она всегда не определена. Нет никаких ошибок, прежде чем я попытаюсь получить доступ к его атрибуту, например remotecall_fetch(println, pid, new_variable.этикетка)
Есть идеи, почему это не работает? Спасибо вам за любую помощь.
Ответ №1:
Используйте ParallelDataTransfer
для этого. Для примера.
using ParallelDataTransfer, Distributed
addprocs(1)
@everywhere using ParallelDataTransfer, Distributed
variable1 = [1,2,3]
@passobj 1 2 variable1
Теперь некоторые консольные тесты:
julia> fetch(@spawnat 2 sum(variable1))
6
julia> fetch(@spawnat 2 variable1[1]=1000)
1000
julia> sum(variable1)
6
julia> fetch(@spawnat 2 sum(variable1))
1005
Комментарии:
1. Спасибо, ParallelDataTransfer работает как волшебство. У меня все еще есть некоторые проблемы, но теперь я знаю, что они связаны с другими частями моего кода.