即使添加了“如果 __name__ == '__main__':”,Windows 上的 python joblib Parallel 也无法正常工作

Posted

技术标签:

【中文标题】即使添加了“如果 __name__ == \'__main__\':”,Windows 上的 python joblib Parallel 也无法正常工作【英文标题】:python joblib Parallel on Windows not working even "if __name__ == '__main__':" is added即使添加了“如果 __name__ == '__main__':”,Windows 上的 python joblib Parallel 也无法正常工作 【发布时间】:2016-05-28 22:05:47 【问题描述】:

我正在 Windows 上的 Python 中运行并行处理。这是我的代码:

from joblib import Parallel, delayed

def f(x): 
    return sqrt(x)

if __name__ == '__main__':
    a = Parallel(n_jobs=2)(delayed(f)(i) for i in range(10))

这是错误信息:

Process PoolWorker-2:  
Process PoolWorker-1:  
Traceback (most recent call last):    
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.4.3105.win-x86_64\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()   
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.4.3105.win-x86_64\lib\multiprocessing\process.py", line 114, in run
self._target(*self._args, **self._kwargs)   
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.4.3105.win-x86_64\lib\multiprocessing\pool.py", line 102, in worker
task = get()   
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\User\lib\site-packages\joblib\pool.py", line 363, in get
return recv()  
AttributeError: 'module' object has no attribute 'f'

【问题讨论】:

您可能想添加一个返回语句def f(x): return sqrt(x) 不,是一样的。我也在某处读到树冠以不同的方式处理事情,所以我尝试在sqrt(x) 之后添加sys.stdout.flush,这也不起作用 不,不是。如果不指定return,则返回值为None 好的,我已经添加了return,但它仍然给我同样的错误信息 给定的代码对我有用。您是否尝试从 Python CLI 执行它?如何执行代码? 【参考方案1】:

根据this site,问题是特定于 Windows 的:

是的:在 linux 下我们是 fork 的,因此他们不需要 pickle 功能,并且工作正常。 windows下需要该功能 pickleable,即它需要从另一个文件中导入。这是 实际上是好的做法:使模块推送以供重用。

我已经尝试过您的代码,它在 Linux 下完美运行。 在 Windows 下,如果它是从脚本运行的,例如python script_with_your_code.py,它运行正常。但是在交互式 python 会话中运行时它会失败。当我将 f 函数保存在单独的模块中并将其导入到我的交互式会话中时,它对我有用。

不工作: 互动环节:

>>> from math import sqrt
>>> from joblib import Parallel, delayed

>>> def f(x):
...     return sqrt(x)

>>> if __name__ == '__main__':
...     a = Parallel(n_jobs=2)(delayed(f)(i) for i in range(10))
...
Process PoolWorker-1:
Traceback (most recent call last):
  File "C:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "C:\Python27\lib\multiprocessing\process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python27\lib\multiprocessing\pool.py", line 102, in worker
    task = get()
  File "C:\Python27\lib\site-packages\joblib\pool.py", line 359, in get
    return recv()
AttributeError: 'module' object has no attribute 'f'

工作: 有趣的.py

from math import sqrt

def f(x):
    return sqrt(x)

互动环节:

>>> from joblib import Parallel, delayed
>>> from fun import f

>>> if __name__ == '__main__':
...     a = Parallel(n_jobs=2)(delayed(f)(i) for i in range(10))
...
>>> a
[0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903, 3.0]

【讨论】:

@kchomski 好帖子。你知道为什么我们需要在交互式会话中使用 if name == 'main' 吗?有必要吗?【参考方案2】:

当我使用 1.19.5 of numpy 版本时,Joblib 正在我的 Windows 10 上运行。我升级了所有过时的软件包;为此,您可以运行以下命令:

pip list --outdated
pip install --upgrade

或者你使用pip_upgrade_outdated,它通过pip install pip-upgrade-outdatedpip-upgrade-outdated根据这个this site升级所有过时的包

【讨论】:

以上是关于即使添加了“如果 __name__ == '__main__':”,Windows 上的 python joblib Parallel 也无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

即使我添加了测试单元,sonarqube 的覆盖率也始终为 0%

即使添加了外部显示器,iOS 模拟器也无法识别 AirPlay

即使在 Procfile 中添加了 Heroku 工人 dyno 也没有出现

React - 即使定义了 defaultProps,TypeScript 也会将 undefined 添加到 prop

即使我在提交之前 git 添加了所有文件,我可以恢复到只有一个文件的先前版本吗?

即使添加了“unsafe-eval”,CSP 也会阻止对 function() 的调用