Windows下Jupyter全局修改fastcore.parallel默认n_workers参数失效如何解决
问题根因
你之前的补丁无效的核心原因是:fastai.vision.utils 模块在你执行补丁代码前就已经完成了对 parallel 函数的导入,直接将函数引用绑定到了自身的模块作用域,你修改 fastcore.parallel.parallel 的指向不会影响已经导入完成的引用。
解决方案1:全局修改parallel默认参数(推荐)
直接修改fastcore.parallel.parallel函数的默认参数值,所有没有主动传入n_workers的调用都会默认使用单进程,不需要关心其他模块的导入时机:
import fastcore.parallel # 定位n_workers参数在默认参数列表中的位置 param_names = fastcore.parallel.parallel.__code__.co_varnames n_workers_idx = list(param_names).index('n_workers') # 替换对应位置的默认值为1 defaults = list(fastcore.parallel.parallel.__defaults__) defaults[n_workers_idx] = 1 fastcore.parallel.parallel.__defaults__ = tuple(defaults)
解决方案2:针对性替换fastai.vision.utils中的parallel引用
如果你只需要修复verify_images的调用问题,可以直接替换fastai.vision.utils模块中已经导入的parallel引用:
import fastai.vision.utils import fastcore.parallel def _patched_parallel(*args, **kwargs): # 强制指定n_workers=1 kwargs["n_workers"] = 1 return fastcore.parallel.parallel(*args, **kwargs) fastai.vision.utils.parallel = _patched_parallel
Windows系统下Jupyter环境触发BrokenProcessPool是Python多进程spawn模式的常见问题,使用单进程可以彻底规避该问题,执行上述任意一段代码后再调用verify_images即可正常运行。
内容的提问来源于stack exchange,提问作者yerpderpington
相关产品推荐
相关产品推荐

