python 2.7 文件即使在使用 "a" 后也会被覆盖(使用线程和文件锁)

python 2.7 file overwritten even after using "a" (threads and filelock used)

我有一个循环,每 5 秒生成一次线程,每个线程都在尝试使用 python 中的文件锁模块附加相同的文件,但看起来它们最终覆盖了文件

import threading
import filelock

def loop():

    threading.Timer(5,loop).start()
    lock = filelock.FileLock("PATH", timeout=20)
    with lock.acquire(timeout=0.1, poll_intervall=0.01):
        with open("PATH", "a") as myFile:
            myFile.write("DATA\n\n")
    lock.release()

编辑:附加信息: 经过多次迭代,我在文件中找到的数据来自最后一个线程,而不是第一个。

编辑:正如下面 georgexsh 所评论的,追加是原子的,因此我们不需要锁。

我想你正在使用这个 filelock package,因为你的代码使用锁对象作为 with 语句的上下文管理器,锁将在 with 块被释放时释放退出。

写数据到锁文件不是一个明智的做法,锁文件在获取锁时会被截断为0,as O_TRUNC being used.

如果您将内部 with 块更改为:

import time

with lock.acquire(timeout=0.1, poll_intervall=0.01):
    with open("PATH", "a") as myFile:
        myFile.write("DATA\n\n")
    time.sleep(1000)

获得文件锁的第一个线程将持有它,其他线程将如您所料被阻塞。


我假设你的意思是这样做:

import threading
import filelock

def loop():

    threading.Timer(5,loop).start()
    lock = filelock.FileLock("FILELOCK", timeout=20)
    with lock.acquire(timeout=0.1, poll_intervall=0.01):
        with open("PATH", "a") as myFile:
            myFile.write("DATA\n\n")
    # lock.release() <== release not needed after 'with'?

此代码使用文件 FILELOCK 作为锁定机制。这将使文件 "PATH" 自由保存您需要的内容。

我猜想在您的原始代码中,FileLock 软件向文件写入了一些内容(不使用追加),这清除了文件和调用 open 和 [= 的最后一个线程14=] 写入文件的开头。