解决"并发追加文件:写操作丢失"问题的一种方法是使用文件锁来确保每次写操作的原子性。下面是一个使用文件锁的示例代码:
import fcntl
def append_to_file(filename, data):
with open(filename, 'a') as file:
try:
fcntl.flock(file.fileno(), fcntl.LOCK_EX) # 获取文件锁
file.write(data)
file.flush()
fcntl.flock(file.fileno(), fcntl.LOCK_UN) # 释放文件锁
except Exception as e:
print(f"Error appending to file: {e}")
# 示例使用
filename = "data.txt"
data = "Hello, World!\n"
# 并发写入数据
# 在多个线程或进程中调用append_to_file函数来追加数据到同一个文件
在上述示例中,我们使用了fcntl.flock()
函数来获取和释放文件锁。fcntl.LOCK_EX
表示获取独占锁,fcntl.LOCK_UN
表示释放锁。
当多个线程或进程同时调用append_to_file
函数时,只有一个线程或进程能够获取到文件锁,这样就确保了每次写操作的原子性。其他线程或进程会等待文件锁的释放才能执行写操作。
请注意,文件锁只能在同一台机器上的多个进程或线程之间起作用,如果有多台机器同时追加写入同一个文件,就需要考虑其他的解决方案,如使用分布式锁。