我有以下情况:
- 运行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除外)。 如果在读取过程之后开始写入过程,则在文件损坏时应该循环读取。 我不确定的是,阅读过程是否最终会读取部分书面文件。
有什么建议吗?更好的解决方案?