【问题标题】:How do I do I/O in Julia distributed for loop run non-interactively?如何在 Julia 分布式 for 循环中以非交互方式运行 I/O?
【发布时间】:2020-06-07 22:59:53
【问题描述】:

foo.jl中使用以下代码:

using Distributed

@distributed for k = 1:4
    println("Creating file ", k)
    write(string("file_", k), "foo")
end

在 REPL 中执行 include("foo.jl") 会打印预期的行并创建预期的文件,但是当我退出 REPL 并运行时

julia foo.jl

没有写入任何文件,也没有创建文件。

为什么存在差异以及脚本在 REPL 之外按预期运行需要什么?

【问题讨论】:

    标签: io julia distributed


    【解决方案1】:

    documentation中所述:

    请注意,如果没有 reducer 函数,@distributed 会异步执行,即它会在所有可用的 worker 上生成独立的任务并立即返回,而无需等待完成。要等待完成,请在调用前加上 @sync

    在您的情况下(不使用减速器功能)会发生这种情况:@distributed 生成任务并立即返回。您的任务非常短,以至于在 REPL 中您几乎可以立即看到它们,并且不会真正注意到与同步过程的区别(除了输出可能与 REPL 提示符混合)。

    然而,在脚本中,julia 主进程在生成任务后立即终止,没有任何机会实际运行它们。而且你看不到输出。

    按照文档的建议,使用@sync 等待任务完成后再存在:

    using Distributed
    
    @sync @distributed for k = 1:4
        println("Creating file ", k)
        write(string("file_", k), "foo")
    end
    

    【讨论】:

      【解决方案2】:

      @distributed 没有阻塞,因此 Julia 进程在写入任何文件之前完成。试试

      using Distributed
      
      @sync @distributed for k = 1:4
          println("Creating file ", k)
          write(string("file_", k), "foo")
      end
      

      改为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        相关资源
        最近更新 更多