Python 在IJulia笔记本的并行处理器上调用numpy

Python 在IJulia笔记本的并行处理器上调用numpy,python,numpy,parallel-processing,julia,ijulia-notebook,Python,Numpy,Parallel Processing,Julia,Ijulia Notebook,我想在IJulia笔记本中运行一个简单的代码,它使用python库numpy。我用PyCall调用numpy: 使用PyCall @pyimport numpy作为np 这个很好用。然后我想把它分成几个处理器。我添加了处理器: addprocs(4) 然后,我为函数f运行N/proc迭代,其中proc是我的处理器数量。我在计算机上的四个处理器之间平均分配负载: 如果没有numpy,这一切都很好。然而,当我试图用numpy将代码拆分到不同的处理器时,我得到了错误 错误(未处理的任务失败):在辅助进

我想在IJulia笔记本中运行一个简单的代码,它使用python库numpy。我用PyCall调用numpy:

使用PyCall

@pyimport numpy作为np

这个很好用。然后我想把它分成几个处理器。我添加了处理器:

addprocs(4)

然后,我为函数f运行N/proc迭代,其中proc是我的处理器数量。我在计算机上的四个处理器之间平均分配负载:

如果没有numpy,这一切都很好。然而,当我试图用numpy将代码拆分到不同的处理器时,我得到了错误

错误(未处理的任务失败):在辅助进程3上:

UndefVarError:未定义np


有没有办法让numpy在其他处理器上工作?注意,我有Julia 0.5.2,还有Canopy。我知道PyCall和Canopy之前曾出现过一些问题,但我更愿意将Canopy保留在我的机器上。

我将扩展Lyndon的评论,以提供更全面的答案

根据,流程是独立的,因此依赖于它们自己的独立工作空间。因此,流程需要的任何函数、模块或变量都需要首先提供给该流程

如果要使某些内容可用于所有现有进程,可以使用
@everywhere
宏;显然,要使“所有现有流程”都可用,首先需要创建这些流程

因此:


我正在扩展林登的评论,以提供更全面的答案

根据,流程是独立的,因此依赖于它们自己的独立工作空间。因此,流程需要的任何函数、模块或变量都需要首先提供给该流程

如果要使某些内容可用于所有现有进程,可以使用
@everywhere
宏;显然,要使“所有现有流程”都可用,首先需要创建这些流程

因此:


为了进一步扩展已经说过的内容,您需要的所有内容都应该加载到所有流程中。例如:

addprocs(4)
@到处使用PyCall
@everywhere@pyimport numpy作为np

您编写的内容出错,因为所有进程都试图使用
@pyimport
,但只有主进程加载了
PyCall
。如果您需要许多软件包来进行计算,可能更简单的方法是在一个脚本中完成所有加载,即
load_modules.jl
,然后简单地运行

addprocs(4)
@任何地方都包括(“load_modules.jl”)

编辑:似乎
使用
@everywhere
的鲁棒性不是很强(固定在Julia 0.6上,请参阅)。似乎效果更好的是:

addprocs(4)
导入PyCall
@到处使用PyCall
@everywhere@pyimport numpy作为np

要进一步扩展已经说过的内容,您需要的所有内容都应该加载到所有流程中。例如:

addprocs(4)
@到处使用PyCall
@everywhere@pyimport numpy作为np

您编写的内容出错,因为所有进程都试图使用
@pyimport
,但只有主进程加载了
PyCall
。如果您需要许多软件包来进行计算,可能更简单的方法是在一个脚本中完成所有加载,即
load_modules.jl
,然后简单地运行

addprocs(4)
@任何地方都包括(“load_modules.jl”)

编辑:似乎
使用
@everywhere
的鲁棒性不是很强(固定在Julia 0.6上,请参阅)。似乎效果更好的是:

addprocs(4)
导入PyCall
@到处使用PyCall
@everywhere@pyimport numpy作为np

Do
add_procs
在所有其他事情之前,并在所有事情之前执行
@where(@pyimport numpy作为np)
Do
add_procs
在所有其他事情之前,并在所有事情之前执行
@pyimport numpy作为np)
我仍然有一个错误:@where(@pyimport numpy作为np)告诉我,@pyimport没有定义好,听起来好像@pyimport还没有定义,不是吗!:)在使用它之前在过程中导入它。我仍然有一个错误:@everywhere(@pyimport numpy as np)告诉我“@pyimport not defined”嗯,听起来好像@pyimport没有定义,不是吗!:)在使用之前,请在过程中导入它。在“使用PyCall”时,我确实使用了@everywhere,但随后我得到了错误“警告:替换模块PyCall”重复了四次。您使用的是Julia 0.6吗?可能是这个问题:。它被标记为已解决,因此它将在下一个版本中停止。不,我正在使用Julia 0.5.2。这里已经解决了:。您只需键入他们的解决方案,它就会起作用,我将更新原始答案。我在“使用PyCall”时使用了@everywhere,但随后我收到错误“警告:替换模块PyCall”重复了四次。您使用的是Julia 0.6吗?可能是这个问题:。它被标记为已解决,因此它将在下一个版本中停止。不,我正在使用Julia 0.5.2。这里已经解决了:。你可以简单地输入他们的解决方案,它应该可以工作,我会更新原始答案。
n=round(Int,N/proc);

proc_sum = @parallel (+) for i=1:proc

        f(n)

end

return proc_sum / proc
addprocs(4); # create 4 extra processes (i.e. workers); this is in addition
             # to the main process that handles the REPL

@everywhere import Pycall
@everywhere PyCall.@pyimport numpy as np # load module on _all_ 5 active processes