Python多进程开发时WinError文件被占用报错如何解决
报错根因
你遇到的文件占用报错核心有两个原因:
- 代码中存在无意义的同名文件重命名操作:你在
process_mp函数的末尾,对空文件和最新文件执行os.rename时,拼接出来的目标路径dst_path_2/dst_path_3和原始文件路径file完全一致,相当于尝试把文件移动到它本身的路径,Windows系统不允许这类操作,会直接抛出文件被占用的错误。 - 全局配置代码位置错误:Windows下Python多进程默认使用spawn模式,每个子进程启动时都会重新导入整个主模块,你写在全局作用域的
config.read、source/archive初始化逻辑会被每个子进程重复执行,虽然不是本次报错的直接原因,但会埋下状态不一致的隐患。
修复方案
- 删除无意义的同名重命名逻辑,直接移除以下两段代码即可:
for file in all_file_paths: if os.path.getctime(file) > time.time() - 120: continue if os.path.getsize(file) == 0: dst_root = source dst_path_2 = os.path.join(dst_root, mp, os.path.basename(file)) os.rename(file, dst_path_2)
以及
if file == newest_file_paths : dst_root = source dst_path_3 = os.path.join(dst_root, mp, os.path.basename(file)) os.rename(file, dst_path_3)
如果确实需要对这两类文件做移动操作,请修改目标路径为和原路径不同的地址。
- 将全局配置逻辑移到
main函数内部,通过参数传递给子进程处理函数,避免全局状态重复初始化:
- 把
config初始化、source/archive读取的代码挪到main函数开头 - 修改
process_mp函数接收source、archive两个参数 - 调用
pool.imap_unordered时用偏函数或者迭代器拼接参数传入
- 修复逻辑bug:你判断red_zone的所有语句都错误使用了等于判断符
==,应该改为赋值符=,否则red_zone永远等于初始值1,阈值判断逻辑完全不生效。
内容的提问来源于stack exchange,提问作者Mediterráneo
相关产品推荐
相关产品推荐

