竞争条件:读/写文件(窗口)

时间:2018-02-15 09:33:53

标签: python python-3.x race-condition file-locking

我有以下情况:

- 运行python脚本的不同用户(所有在Windows操作系统上),该脚本可以读取或写入位于共享文件夹上的pickle文件。

-the" system"设计的方式是一次只有一个用户将写入文件(因此没有更多进程尝试在文件上同时写入的竞争条件)

- 要编写的基本代码是:

with open(path + r'\final_db.p', 'wb') as f:
    pickle.dump((x, y), f)

- 虽然要阅读的代码是:

with open(path + r'\final_db.p', 'rb') as f:
    x, y = pickle.load(f)

-x是5K或plus元素的列表,其中每个元素是包含许多属性和函数的类实例; y是日期

问题:

假如在阅读和写作过程重叠时存在竞争条件,我是否正确?读取文件最终可能会损坏文件?

建议的解决方案:

1.我想到的一个可能的解决方案是使用filelock:

要编写的代码:

file_path = path + r'\final_db.p'
lock_path = file_path + '.lock'
lock = filelock.FileLock(lock_path, timeout=-1)
with lock:
    with open(file_path, 'wb') as f:
        pickle.dump((x, y), f)

代码阅读:

file_path = path + r'\final_db.p'
lock_path = file_path + '.lock'
lock = filelock.FileLock(lock_path, timeout=-1)
with lock:
    with open(file_path, 'rb') as f:
         x, y = pickle.load(f)

此解决方案应该有效(??),但如果进程崩溃,文件将一直被阻塞,直到" file_path +' .lock'"被取消

2.另一种解决方案可能是使用portalocker

要编写的代码:

with open(path + r'\final_db.p', 'wb') as f:
    portalocker.lock(f, portalocker.LOCK_EX)
    pickle.dump((x, y), f)

代码阅读:

segnale = True
while segnale:
    try:
        with open(path + r'\final_db.p', 'rb') as f:
            x, y = pickle.load(f)
        segnale = False
    except:
        pass

读取过程,如果另一个进程在它之前开始写入,将继续循环直到文件被解锁(PermissionError除外)。 如果在读取过程之后开始写入过程,则在文件损坏时应该循环读取。 我不确定的是,阅读过程是否最终会读取部分书面文件。

有什么建议吗?更好的解决方案?

0 个答案:

没有答案