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


问题内容

我正在Windows Server 2013上运行Python 3.5.1。我有一些令人尴尬的并行任务,它们似乎在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__':声明的需要有关吗?我不认为我会需要它,因为已经Paralleldef语句内保护了,并且仅
__main__调用模块时运行,而该模块只能发生一次。

我要补充一点,如果我改变n_jobs=1amodule.py,一切工作正常。

更新:

因此,在进一步审查之后,看来这可能与spyder有关。我正在使用spyder
2.3.8。当我执行spyder时,这是一个专用窗口,它可以工作。但是,当它在交互式IPython控制台中运行时,它将失败。我也可以直接从命令行运行程序而不会出现问题。

更新2:

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


问题答案:

此处为Spyder dev )如果此问题是由runfile设置工作目录引起的,则可以通过转到菜单条目来防止这种情况发生

Run > Configuration per file

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

注意事项

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