我正在编写一个python脚本,将通过网络访问,因此可能会有多个用户同时尝试向同一个文件追加内容。我的担忧是这可能会导致竞争条件,如果多个用户同时写入同一个文件,可能会破坏该文件。
例如:
#!/usr/bin/env python
g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close
由于此操作看起来可能存在风险,我是否需要使用锁文件?
我正在编写一个python脚本,将通过网络访问,因此可能会有多个用户同时尝试向同一个文件追加内容。我的担忧是这可能会导致竞争条件,如果多个用户同时写入同一个文件,可能会破坏该文件。
例如:
#!/usr/bin/env python
g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close
由于此操作看起来可能存在风险,我是否需要使用锁文件?
你可以使用文件锁定:
import fcntl
new_entry = "foobar"
with open("/somepath/somefile.txt", "a") as g:
fcntl.flock(g, fcntl.LOCK_EX)
g.write(new_entry)
fcntl.flock(g, fcntl.LOCK_UN)
请注意,如果您只写入小缓冲区,则在某些系统上,若进行追加操作,则不需要锁定,因为这些系统上的追加操作是原子性的。
flock
在获取锁之前不会返回。 - phihag
mkfifo
可能是一个不错的选择。mkfifo
创建一个FIFO特殊文件。 任何人都可以随机地向该文件写入数据,然后只有一个进程从FIFO中读取数据。这样就不需要使用文件锁定了。 - Kenji NoguchiO_APPEND
打开文件,目标文件系统符合 POSIX 标准,并且您的写操作足够短,可以在单个系统调用中完成,则不会发生任何损坏。 - Charles Duffy