即使添加了“如果 __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-outdated
和pip-upgrade-outdated
根据这个this site升级所有过时的包
【讨论】:
以上是关于即使添加了“如果 __name__ == '__main__':”,Windows 上的 python joblib Parallel 也无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
即使我添加了测试单元,sonarqube 的覆盖率也始终为 0%
即使添加了外部显示器,iOS 模拟器也无法识别 AirPlay
即使在 Procfile 中添加了 Heroku 工人 dyno 也没有出现
React - 即使定义了 defaultProps,TypeScript 也会将 undefined 添加到 prop