Parallel processing 朱莉娅没有';我不喜欢在不进行任何并行处理的情况下添加和删除进程

Parallel processing 朱莉娅没有';我不喜欢在不进行任何并行处理的情况下添加和删除进程,parallel-processing,julia,Parallel Processing,Julia,更新:确认为错误。有关更多详细信息,请参阅下面@ViralBShah提供的链接和详细信息 当我添加和删除进程(addprocs和rmprocs)时,Julia抛出了一个奇怪的错误,但前提是我在这两者之间没有进行任何并行处理。考虑下面的示例代码: #Set parameters numCore = 4; #Add workers print("Adding workers... "); addprocs(numCore - 1); println(string(string(numCore-1)

更新:确认为错误。有关更多详细信息,请参阅下面@ViralBShah提供的链接和详细信息

当我添加和删除进程(
addprocs
rmprocs
)时,Julia抛出了一个奇怪的错误,但前提是我在这两者之间没有进行任何并行处理。考虑下面的示例代码:

#Set parameters
numCore = 4;

#Add workers
print("Adding workers... ");
addprocs(numCore - 1);
println(string(string(numCore-1), " workers added."));

#Detect number of cores
println(string("Number of processes detected = ", string(nprocs())));

# Do some stuff (COMMENTED OUT)
# XLst = {rand(10, 1) for i in 1:8};
# XMean = pmap(mean, XLst);

#Remove the additional workers
print("Removing workers... ");
rmprocs(workers());
println("Done.");
println("Subroutine complete.");
请注意,我已经注释掉了唯一真正执行并行处理的代码(调用
pmap
)。如果我在我的机器上运行此代码(Julia 0.2.1,Ubuntu 14.04),我会在控制台中得到以下输出:

Adding workers... 3 workers added.
Number of processes detected = 4
Removing workers... Done.
Subroutine complete.
fatal error on 
In  [86]: fatal error on 88: ERROR: 87: ERROR: connect: connection refused (ECONNREFUSED)
 in yield at multi.jl:1540
connect: connection refused (ECONNREFUSED) in wait at task.jl:117
 in wait_connected at stream.jl:263
 in connect at stream.jl:878
 in Worker at multi.jl:108
 in anonymous at task.jl:876

 in yield at multi.jl:1540
 in wait at task.jl:117
 in wait_connected at stream.jl:263
 in connect at stream.jl:878
 in Worker at multi.jl:108
 in anonymous at task.jl:876
前四行是由我的程序打印的,似乎表明它运行到完成。但是我犯了一个致命的错误。有什么想法吗


关于这个错误最有趣的事情是,如果我调用
pmap
(即如果我真的进行了一些并行处理)取消对代码的注释,致命错误就会消失。

这个问题正在跟踪中,我重现了Amit Murthy的答案:

  • pid 1执行addprocs(3)
  • addprocs在与所有3名新员工建立连接后返回
  • 但是,此时工人之间的连接可能尚未设置,即从pids 3->2、4->2和4->3
  • 现在,pid 1调用rmprocs(workers()),即pid 2、3和4
  • 当pid 2退出时,4到2中的连接尝试将导致错误
  • 因为我们已经将pid 4的输出重定向到pid 1的标准输出,所以我们看到相同的错误被打印出来。 系统仍处于一致状态,尽管打印所述错误消息可能表明有问题

  • 这个问题正在跟踪,我复制了Amit Murthy的答案:

  • pid 1执行addprocs(3)
  • addprocs在与所有3名新员工建立连接后返回
  • 但是,此时工人之间的连接可能尚未设置,即从pids 3->2、4->2和4->3
  • 现在,pid 1调用rmprocs(workers()),即pid 2、3和4
  • 当pid 2退出时,4到2中的连接尝试将导致错误
  • 因为我们已经将pid 4的输出重定向到pid 1的标准输出,所以我们看到相同的错误被打印出来。 系统仍处于一致状态,尽管打印所述错误消息可能表明有问题

  • 看起来像个虫子。您应该将此作为一个问题归档:看起来像一个bug。您应该将此作为问题提交:感谢您的跟进。我一直想回到这里,提供一个到github问题页面的链接,但还没有找到。ps我是茱莉亚的新皈依者,我喜欢它的每一秒,所以谢谢你。谢谢你的跟进。我一直想回到这里,提供一个到github问题页面的链接,但还没有找到。ps我是朱莉娅的新皈依者,我喜欢它的每一秒,所以谢谢你。