Parallel processing 包修改和分布式循环问题

Parallel processing 包修改和分布式循环问题,parallel-processing,julia,distributed,Parallel Processing,Julia,Distributed,所以我想做一些计算,因此我想并行化一个循环。 我正在使用修订包来应用我在代码中所做的更改。 如果我在更改某些内容后重新启动完整的julia会话,这将很好地工作 我尝试了一些不同的选择并简化了我的问题,但我找不到解决方案 我创建了以下模块: module ParallelTester using Distributed export paralleltest function paralleltest() @sync @distributed for i in 1:100

所以我想做一些计算,因此我想并行化一个循环。 我正在使用修订包来应用我在代码中所做的更改。 如果我在更改某些内容后重新启动完整的julia会话,这将很好地工作

我尝试了一些不同的选择并简化了我的问题,但我找不到解决方案

我创建了以下模块:

module ParallelTester

using Distributed
export paralleltest

function paralleltest()
    @sync @distributed for i in 1:100
        println("Hi there!")
    end
end

end
当我开始julia课程时,我会执行以下操作:

using Distributed
addprocs(3)
push!(LOAD_PATH, pwd())
@everywhere using Revise, ParallelTester
当我运行函数
paralleltest()
时,结果按预期打印

当我现在从
Hi那里更改输出时
你好,又到了,我得到这个错误:

ERROR: On worker 2:
UndefVarError: ##5#6 not defined
deserialize_datatype at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:1115
handle_deserialize at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:771
deserialize at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:731
deserialize_datatype at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:1139
handle_deserialize at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:771
deserialize at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:731
handle_deserialize at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:778
deserialize_msg at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Serialization\src\Serialization.jl:731
#invokelatest#1 at .\essentials.jl:742 [inlined]
invokelatest at .\essentials.jl:741 [inlined]
message_handler_loop at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Distributed\src\process_messages.jl:160
process_tcp_streams at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Distributed\src\process_messages.jl:117
#105 at .\task.jl:259
#remotecall_fetch#149(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::Function, ::Function, ::Distributed.Worker, ::Distributed.RRID, ::Vararg{Any,N} where N) at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Distributed\src\remotecall.jl:379
remotecall_fetch(::Function, ::Distributed.Worker, ::Distributed.RRID, ::Vararg{Any,N} where N) at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Distributed\src\remotecall.jl:371
#remotecall_fetch#152(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::Function, ::Function, ::Int64, ::Distributed.RRID, ::Vararg{Any,N} where N) at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Distributed\src\remotecall.jl:406
call_on_owner at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Distributed\src\remotecall.jl:406 [inlined]
wait(::Future) at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Distributed\src\remotecall.jl:500
sync_end(::Array{Any,1}) at .\task.jl:213
(::getfield(Distributed, Symbol("##167#169")){getfield(Tester, Symbol("##5#6")),UnitRange{Int64}})() at .\task.jl:245
Stacktrace:
 [1] sync_end(::Array{Any,1}) at .\task.jl:226
 [2] macro expansion at .\task.jl:245 [inlined]
 [3] parallelTest() at C:\Users\FelixMeyer\AppData\Local\Julia-1.1.1\Tester.jl:9
 [4] top-level scope at none:0
我错过了什么


我在修订包中发现了这一点,它说匿名函数可能会出现这种错误。

解决方法是将
并行测试的“勇气”放在一个单独的函数中:

function paralleltest(rng)
    @sync @distributed for i in rng
        paralleltestcore()
    end
end

paralleltestcore() = println("Hi there!")

但如果能解决这个问题就好了。如果我们降低主进程上的代码,然后将降低的代码发送到每个进程进行评估,那么可能有一种方法可以做到这一点。同时,我把这个案子添加到了我的案子里

一种解决方法是将
paralleltest
的“勇气”放在一个单独的函数中:

function paralleltest(rng)
    @sync @distributed for i in rng
        paralleltestcore()
    end
end

paralleltestcore() = println("Hi there!")

但如果能解决这个问题就好了。如果我们降低主进程上的代码,然后将降低的代码发送到每个进程进行评估,那么可能有一种方法可以做到这一点。同时,我把这个案子添加到了我的案子里

谢谢你提供的信息。这个解决办法比我想象的要容易。我用pmap解决了这个问题。我们将查看运行时结果。更新:使用Julia 1.3和修订版2.3.2,即使是原始测试用例现在也应该可以工作了。感谢您提供的信息。这个解决办法比我想象的要容易。我用pmap解决了这个问题。更新:使用Julia 1.3和修订版2.3.2,即使是原来的测试用例现在也可以工作了。