进程 1 和进程 2 中的目标路径/tmp/abc 假设有 N 个进程正在运行 我们需要保留最新版本生成的文件
流程1
import shutil
shutil.move(src_path, destination_path)
流程 2
import os
os.remove(destination_path)
溶液 1.处理过程,如果复制失败,[ErrNo2]没有这样的文件或目录
这是正确的解决方案吗?有没有更好的方法来解决这个问题
有用的链接 安全的原子文件复制操作
您可以使用FileNotFoundError
错误
try :
shutil.move(src_path, destination_path)
except FileNotFoundError:
print ('File Not Found')
# Add whatever logic you want to execute
except :
print ('Some Other error')
想到的主要解决方案是
- 在每个进程
staging file
中保留部分信息 - 依靠
the os
进行原子moves
或
- 在每个进程
memory
中保留部分信息 - 依靠
interprocess communication / locks
进行原子writes
对于第一个,例如:
import tempfile
import os
FINAL = '/tmp/something'
def do_stuff():
fd, name = tempfile.mkstemp(suffix="-%s" % os.getpid())
while keep_doing_stuff():
os.write(fd, get_output())
os.close(fd)
os.rename(name, FINAL)
if __name__ == '__main__':
do_stuff()
您可以选择从 shell(如上所示(或使用一些进程包装器(子进程或多处理都可以(单独调用,无论哪种方式都可以。
对于进程间,您可能希望从父进程生成所有内容
from multiprocessing import Process, Lock
from cStringIO import StringIO
def do_stuff(lock):
output = StringIO()
while keep_doing_stuff():
output.write(get_output())
with lock:
with open(FINAL, 'w') as f:
f.write(output.getvalue())
output.close()
if __name__ == '__main__':
lock = Lock()
for num in range(2):
Process(target=do_stuff, args=(lock,)).start()