python如何确保文件改动内容已经写入磁盘

在共享文件系统中,A流程使用Python的with open as方式读写文件,然后立即通知B流程。偶尔出现B读取到不完整或为空的文件。问题在于A的文件改动可能未被立刻写入磁盘。解决方案是在关闭文件后调用os.sync()或os.fsync()来强制写入。os.sync()影响所有文件改动,os.fsync()仅影响特定文件描述符,性能影响较小。
摘要由CSDN通过智能技术生成

背景:两个业务流程基于共享文件系统进行交互,A流程改动文件后,保存文件,通知B流程开始(通过业务编排系统或者直接调用B的接口进行通知)。 B流程开始读取该文件进行处理,偶发的B发现文件不完整,或者文件大小为0。

A 和B 是运行不同pod中的程序。 都挂在的该共享存储的盘, A写入后,B读取处理,再向下流转。

分析:问题是偶发的, 通过长期观察日志,有时发生问题的是A新写的文件相对较大,或者此时有A有好多写文件的操作,并且A刚close文件,立刻通知B开始操作。基本B读取文件是在A close文件后的不到1毫秒开始的。
  经过确认A的文件确定调用close的方法的,A流程使用python开发,通过 with open as 方式读写文件的。
   查看linux文件的读写过程,发现flush只能确保程序对文件的改动会进入的所在os的page cache中,并不会一定立刻写入到磁盘中,具体何时写入到磁盘中取决于操作系统。
   而我们使用的共享文件系统,A流程虽然调用close,但是文件改动不应此时就save to disk,所以B流程该文件时候,可能发生读取的文件不完整的。 A和B位于不同机器,没法共享page cache。

具体解决办法:所有通过 with open 或者write方法写入文件的地方,在后面统一调用os.sync 或者os.fsync()

    with 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值