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=] 写入文件的开头。
我有一个循环,每 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=] 写入文件的开头。