Azure Blob Storage并发运行代码触发OS error 22指向f.close()的原因查询
OS Error 22 问题原因及修复说明
核心诱因判断
手动调用f.close()确实是触发该错误的直接原因:
with open()语法的上下文管理器会在代码块执行结束时自动调用f.close()释放句柄资源,你在代码块内手动调用f.close()后,对应的文件描述符已经被系统回收,被标记为无效状态- 待
with代码块执行完毕,Python自动触发第二次close()操作时,传入的无效文件句柄会被系统判定为非法参数,直接抛出OS Error 22: Invalid argument
Azure Blob Storage 场景的特殊性
该错误在Blob存储场景下更容易复现,是因为你大概率是通过BlobFuse等工具将Blob存储挂载为了本地虚拟文件系统,这类虚拟文件系统对文件句柄的合法性校验比本地磁盘严格得多:
- 本地磁盘文件系统中,重复关闭无效句柄多数时候仅会静默失败,不会抛出显性错误
- 挂载的Blob存储虚拟文件系统对所有IO操作的参数校验逻辑更严格,并发场景下的资源争抢会进一步放大非法句柄调用的异常表现,因此会明确抛出22号错误
修复方案
直接删除代码中手动调用的f.close()行即可,修改后代码如下:
with open(openfilepath,"w+") as f: f.write(writeFile)
内容的提问来源于stack exchange,提问作者John_Che
相关产品推荐
相关产品推荐

