【问题标题】:Julia parallel function inside module模块内的 Julia 并行函数
【发布时间】:2018-11-17 05:47:41
【问题描述】:

我在模块中有一个函数,我想在其中动态更改进程数 (addproc)。在我启动这些新过程之后,我想添加一个要在每个工作人员上执行的函数。但是,我在模块内部使用 @everywhere 定义此函数时遇到了困难。我只想在函数do_work 中生成这些新进程。我不想在导入/使用模块之前生成新进程(这对于多线程来说是一项理想的工作,但我的函数会执行大量 I/O,而我目前在 Julia 1.0 中遇到了段错误)。

这是我的问题的一个简单的工作示例。有没有办法在工作进程上定义foo(最好不调用@everywhere include("somefile_with_foo.jl")

module Example

using Distributed

function do_work()
    total_procs = nprocs()
    # Make sure we have as many works are cores
    if total_procs < Sys.CPU_THREADS
        addprocs(Sys.CPU_THREADS - total_procs); 
    end

    @everywhere function foo(x::Integer)
        println(x)
    end

    remotecall(foo, 2, 2)

    while nprocs() > total_procs
        rmprocs(procs()[end])
    end
end
end

【问题讨论】:

    标签: parallel-processing multiprocessing thread-safety julia


    【解决方案1】:

    您不能在函数内使用@everywhere,因为该函数有自己的命名范围,而该范围在远程进程中不存在。

    一个选项(在大多数情况下是推荐的方法)是在所有工作人员上加载module

    @everywhere using Example
    

    现在您可以在远程工作人员上使用它的功能了。

    但是,如果您真的希望能够定义和运行远程函数,您可以使用元编程将代码发送到远程进程。考虑下面我的 Julia 会议:

    julia> using Distributed
    
    julia> addprocs(1)
    1-element Array{Int64,1}:
     2
    
    julia> function do_work(w)
        f_foo = quote 
            function foo(x::Int64)
               println("hello ",x," from ",myid())
            end
        end
        Main.eval(f_foo)
        @fetchfrom w Main.eval(f_foo)
        @fetchfrom w foo(9999)
    end
    do_work (generic function with 1 method)
    
    julia> do_work(2)
          From worker 2:    hello 9999 from 2
    

    【讨论】:

    • 同意。使用@everywhere using Example 是最简单的,但需要在此语句之前的某处调用addprocs,而不仅仅是在函数中,我想让它对用户透明。引用和评估是解决这个问题的一个非常巧妙的解决方案!漂亮。
    • 如果 Julia 的 I/O 是线程安全的,我的问题将在 C 中使用线程轻松解决...
    • 您可以在do_work 函数中使用addprocs。计算完成后使用rmprocs 销毁进程。
    • 关于线程 - 只需创建一个屏障函数,用于写入使用“SpinLock”控制两个线程不同时写入的流。这样,函数可以被多个线程调用,但写入会顺序发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多