Parallel processing 模内Julia并行函数

Parallel processing 模内Julia并行函数,parallel-processing,multiprocessing,thread-safety,julia,Parallel Processing,Multiprocessing,Thread Safety,Julia,我在一个模块中有一个函数,我想在其中动态更改进程的数量(addproc)。在我启动这些新进程之后,我想添加一个要在每个worker上执行的函数。但是,在模块内部,我很难使用@everywhere定义此函数。我只想在函数do\u work中创建这些新进程。我不想在导入/使用模块之前产生新的进程(这对于多线程来说是一个理想的工作,但是我的函数做了很多I/O,我目前在Julia 1.0中遇到了一个segfault) 下面是我的问题的一个简单的工作示例。有没有办法在工作进程上定义foo(理想情况下不调用

我在一个模块中有一个函数,我想在其中动态更改进程的数量(
addproc
)。在我启动这些新进程之后,我想添加一个要在每个worker上执行的函数。但是,在模块内部,我很难使用
@everywhere
定义此函数。我只想在函数
do\u work
中创建这些新进程。我不想在导入/使用模块之前产生新的进程(这对于多线程来说是一个理想的工作,但是我的函数做了很多I/O,我目前在Julia 1.0中遇到了一个segfault)

下面是我的问题的一个简单的工作示例。有没有办法在工作进程上定义
foo
(理想情况下不调用
@everywhere include(“somefile\u with_foo.jl”)

模块示例
使用分布式
函数do_work()
总进程=nprocs()
#确保我们有尽可能多的作品是核心
如果总进程总进程
rmprocs(procs()[end])
结束
结束
结束

不能在函数内部使用
@everywhere
,因为函数有自己的命名范围,而远程进程上不存在此范围

一种选择(在大多数情况下,这是推荐的方法)是在所有工作人员上加载
模块

@everywhere using Example
现在您可以在远程工作者上使用它的功能

但是,如果您确实希望能够定义和运行远程函数,则可以使用元编程将代码发送到远程进程。考虑下面的朱丽亚会话:

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
是最简单的,但是需要在该语句之前的某个地方调用
addprocs
,而不仅仅是在函数中,我想让parallel对用户透明。引用和评估是解决这个问题的一个非常巧妙的方法!很好。如果Julia的I/O是线程安全的,那么我的问题在C中就可以用线程解决了……您可以在
do_work
函数中使用
addprocs
。计算完成后,使用
rmprocs
销毁进程。关于线程,只需创建一个屏障函数,用于写入流,该流使用“自旋锁”控制两个线程不同时写入。通过这种方式,该函数可以被多个线程调用,但写入将按顺序进行。
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