使用fastai的download_images函数时触发多进程错误的原因及解决办法
使用fastai的download_images函数时触发多进程错误的原因及解决办法
问题原因
你遇到的这个报错是Windows系统下Python多进程机制导致的典型问题。从错误栈里的_check_not_importing_main()可以明确看出:
- Windows中Python多进程默认采用
spawn启动方式,这种方式会重新导入主脚本模块来创建子进程 - 你的代码没有用
if __name__ == '__main__':包裹核心执行逻辑,导致子进程启动时会重复执行下载、目录创建等代码,直接干扰了multiprocessing Manager的初始化流程,最终引发进程启动失败的错误 - fastai的
download_images底层依赖parallel函数实现加速,而parallel默认会启用多进程,这就刚好触发了这个多进程启动的冲突
快速解决办法
最直接有效的修复方式是把所有涉及执行逻辑的代码(尤其是调用download_images的循环部分)放到if __name__ == '__main__':代码块中,避免子进程重复执行初始化代码。
修改后的完整代码示例如下:
from duckduckgo_search import DDGS from fastcore.all import * from fastdownload import download_url from fastai.vision.all import * from time import sleep def search_images(keywords, max_images=200): return L(DDGS().images(keywords, max_results=max_images)).itemgot('image') # 基础测试代码(可选,若不需要可移除) urls = search_images('bird photos', max_images=1) print(urls[0]) dest = 'bird.jpg' download_url(urls[0], dest, show_progress=False) im = Image.open(dest).to_thumb(256,256) download_url(search_images('forest photos', max_images=1)[0], 'forest.jpg', show_progress=False) Image.open('forest.jpg').to_thumb(256,256) searches = 'forest','bird' path = Path('bird_or_not') # 核心执行逻辑放到main块中 if __name__ == '__main__': for o in searches: dest = (path/o) dest.mkdir(exist_ok=True, parents=True) download_images(dest, urls=search_images(f'{o} photo')) sleep(10) # 暂停避免服务器过载 download_images(dest, urls=search_images(f'{o} sun photo')) sleep(10) download_images(dest, urls=search_images(f'{o} shade photo')) sleep(10) resize_images(path/o, max_size=400, dest=path/o)
其他可选方案
如果你暂时不想调整代码结构,也可以强制download_images不使用多进程,只需在调用时添加parallel=False参数(但下载速度会变慢):
download_images(dest, urls=search_images(f'{o} photo'), parallel=False)
另外你提到的pip无法更新问题和本次多进程错误无关,后续若仍有该问题,可尝试用管理员权限运行终端,执行python -m pip install --upgrade pip来排查。
备注:内容来源于stack exchange,提问作者Jacob F.
相关产品推荐
相关产品推荐

