我正在开发一个可以通过网络访问的 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)
请注意,在某些系统上,如果您只编写小缓冲区,则不需要锁定,因为这些系统上的追加是 atomic。
如果你在 Linux 上做这个操作,并且缓存大小小于 4KB,写操作是原子的,你应该很好。
在这里阅读更多内容: 文件附加在 UNIX 中是原子的吗?
您没有说明您使用的平台,但这里有一个您可以使用的跨平台模块: Python 中的文件锁定
根据您的平台/文件系统位置,这可能无法以安全的方式进行(例如 NFS)。也许您可以写入不同的文件并在之后合并结果?