37

我正在开发一个可以通过网络访问的 python 脚本,因此会有多个用户尝试同时附加到同一个文件。我担心这可能会导致竞争条件,如果多个用户同时写入同一个文件,它可能会损坏文件。

例如:

#!/usr/bin/env python

g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close

我是否必须为此使用锁定文件,因为此操作看起来有风险。

4

4 回答 4

46

您可以使用文件锁定

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

于 2012-08-07T20:27:12.143 回答
4

如果你在 Linux 上做这个操作,并且缓存大小小于 4KB,写操作是原子的,你应该很好。

在这里阅读更多内容: 文件附加在 UNIX 中是原子的吗?

于 2017-11-09T23:11:09.493 回答
2

您没有说明您使用的平台,但这里有一个您可以使用的跨平台模块: Python 中的文件锁定

于 2012-08-07T20:26:59.660 回答
1

根据您的平台/文件系统位置,这可能无法以安全的方式进行(例如 NFS)。也许您可以写入不同的文件并在之后合并结果?

于 2012-08-07T21:00:52.917 回答