Joblib.在Windows上挂起的Spyder中并行运行

2022-04-05 00:00:00 python python-3.x spyder joblib

问题描述

我工作时在Windows Server 2013上运行的是Python3.5.1。我有一些令人尴尬的并行任务,它们似乎可以用基本相同的代码在Python2.7上运行,但我不知道如何让它在Python3.5.1上运行。

我使用的是蟒蛇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执行这是一个专用窗口时,它可以工作。但当它在交互式IPython控制台中运行时,它会失败。我也可以直接从命令行运行程序,没有问题。

更新2:

进一步查看后,这确实与IPython位于与*.py文件不同的工作目录有关。把它们排好,这就管用了。


解决方案

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

来防止这种情况发生
Run > Configuration per file

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

备注:

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

相关文章