joblib.Parallel 运行 通过挂在 Windows 上的 spyder

joblib.Parallel running through spyder hanging on Windows

我正在 运行宁 Python 3.5.1 在 Windows Server 2013 上工作。我有一些令人尴尬的并行任务,它们似乎可以在 Python 2.7 上使用基本相同的代码运行,但我无法弄清楚如何在 Python 3.5.1 上将其运行到 运行。

我正在使用 Anaconda 2.4.1

代码看起来像这样...我已经将它精简到最少。

\
->main.py
\apackage\
->__init__.py
->amodule.py

main.py

代码
from tpackage import AClass

def go():
    x = AClass().AFunction()
    return x
if __name__ == '__main__':
    x = go()
    print(x)

__init__.py

代码
from .amodule import AClass

__all__ = ['AClass']

amodule.py

代码
from joblib import Parallel, delayed

class AClass(object):
    def AFunction(self):
        x = Parallel(n_jobs=2,verbose=100)(
            delayed(add1)(i) for i in range(10)
            )
        return x

def add1(x):   
    return x + 1

这与需要 if __name__ == '__main__': 声明有什么关系吗?我认为我不需要这个,因为 Parallel 已经在 def 语句中受到保护,并且 应该 只有 运行 当 __main__ 模块被调用,这应该只发生一次。

我应该补充一点,如果我在 amodule.py 中更改 n_jobs=1,一切正常。

更新:

所以经过进一步审查,这似乎与spyder有关。我正在使用 spyder 2.3.8。当我让 spyder 执行时,这是一个专用的 window,它可以工作。但是当它 运行 在交互式 IPython 控制台中时,它失败了。我也可以 运行 直接从命令行运行程序,没有问题。

更新二:

经过进一步审查,这确实与 IPython 与 *.py 文件位于不同的工作目录有关。把那些排好,这行得通。

(Spyder dev here) 如果此问题是由 runfile 设置工作目录引起的,您可以通过转到菜单条目

Run > Configuration per file

(或按 Ctrl+F6)并选择名为 当前工作目录.

的选项

备注:

  1. 运行配置为每个文件保存,Spyder 会在重新启动后记住它。
  2. Spyder 3.2 及更高版本的答案已更新。