Joblib.在Windows上挂起的Spyder中并行运行
问题描述
我工作时在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
)并选择名为当前工作目录的选项。
备注:
- 为每个文件保存运行配置,Spyder在重新启动后会记住它。
- Spyder3.2及更高版本的答案已更新。
相关文章