我写了一个脚本,需要执行安全写入任何给定的文件,即附加一个文件,如果没有其他进程已知写入它。 我对这个理论的理解是,在文件系统上使用写入锁来阻止并发写入,但实际上似乎并非如此。
以下是我设置testing用例的方法:我正在redirectping命令的输出:
ping 127.0.0.1 > fileForSafeWrites.txt
另一方面,我有下面的python代码试图写入文件:
handle = open('fileForSafeWrites.txt', 'w') handle.write("Probing for opportunity to write") handle.close()
同时并行运行这两个进程正常完成。 我看到fileForSafeWrites.txt已经变成了一个二进制内容的文件,而不是由第一个进程发出的写锁,以防止它被Python代码写入。
如何强制我的并发进程中的任何一个或两个不相互干扰? 我已经阅读人们build议能够得到一个写文件句柄作为文件写入安全的证据,如在https://stackoverflow.com/a/3070749/1309045
这是特定于我的操作系统和Python的行为。 我在Ubuntu 12.04环境中使用Python2.7。
受益于所描述的并发检查解决方案 ,我想出了以下代码片段。 如果能够恰当地预测写入的文件的频率,它就可以工作。 解决方案是通过使用文件修改时间。
import os import time '''Find if a file was modified in the last x seconds given by writeFrequency.''' def isFileBeingWrittenInto(filename, writeFrequency = 180, overheadTimePercentage = 20): overhead = 1+float(overheadTimePercentage)/100 # Add some buffer time maxWriteFrequency = writeFrequency * overhead modifiedTimeStart = os.stat(filename).st_mtime # Time file last modified time.sleep(writeFrequency) # wait writeFrequency # of secs modifiedTimeEnd = os.stat(filename).st_mtime # File modification time again if 0 < (modifiedTimeEnd - modifiedTimeStart) <= maxWriteFrequency: return True else: return False if not isFileBeingWrittenInto('fileForSafeWrites.txt'): handle = open('fileForSafeWrites.txt', 'a') handle.write("Text written safely when no one else is writing to the file") handle.close()
这不会做真正的并发检查,但可以结合各种其他方法的实际目的安全地写入到一个文件,而不必担心乱码文本。 希望它有助于下一个人寻找一种方法来做到这一点。
编辑更新 :
经过进一步的测试,我遇到了一个高频写入过程,需要从条件逻辑进行修改
if 0 < (modifiedTimeEnd - modifiedTimeStart) < maxWriteFrequency
至
if 0 < (modifiedTimeEnd - modifiedTimeStart) <= maxWriteFrequency
这在理论上和实践中都会得到更好的答案。
使用lockfile模块,如在Python中锁定文件所示