确保我的程序不执行并发文件wri

2024-10-01 17:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,该脚本需要对任何给定的文件执行安全写入,即,如果不知道有其他进程在写入文件,则附加一个文件。我对这个理论的理解是,使用文件系统上的写锁可以防止并发写操作,但在实践中似乎不是这样。在

下面是我如何设置测试用例: 我正在重定向ping命令的输出:

ping 127.0.0.1 > fileForSafeWrites.txt

另一方面,我有以下python代码试图写入文件:

^{pr2}$

同时运行两个进程优雅地完成。我明白了fileForSafeWrites.txt文件变成了一个包含二进制内容的文件,而不是由第一个进程发出的写锁来保护它不被Python代码写入。在

如何强制其中一个或两个并发进程互不干扰?我读过一些人建议,获取一个写文件句柄作为将文件写入安全区的证据的能力,例如在https://stackoverflow.com/a/3070749/1309045

这种行为是特定于我的操作系统和Python的吗。我在ubuntu12.04环境中使用Python2.7。在


Tags: 文件代码命令txt脚本内容进程二进制
2条回答

solution described for concurrency checks的启发,我想出了下面的代码片段。如果一个人能够适当地预测所讨论的文件的写入频率,它就可以工作了。解决方法是通过使用文件修改时间。在

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()

这不能进行真正的并发检查,但可以与各种其他方法结合使用,以安全地写入到文件中,而不必担心出现乱码。希望它能帮助下一个想办法做到这一点的人。在

编辑更新

在进一步的测试中,我遇到了一个高频写入过程,需要从中修改条件逻辑

^{pr2}$

if 0 < (modifiedTimeEnd - modifiedTimeStart) <= maxWriteFrequency 

这在理论上和实践上都是一个更好的答案。在

使用lockfile模块,如Locking a file in Python所示

相关问题 更多 >

    热门问题