Julia Distributed — почему переменная не определена в worker после вычисления выражения?

#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 работает как волшебство. У меня все еще есть некоторые проблемы, но теперь я знаю, что они связаны с другими частями моего кода.