甚至在使用“a”(使用线程和文件锁)后,python 2.7文件被覆盖
我有一个循环每5秒产生一次线程,每个线程都试图在python中使用filelock模块追加相同的文件,但看起来像它们最终结束 - 写入文件甚至在使用“a”(使用线程和文件锁)后,python 2.7文件被覆盖
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所述,append是原子的,因此我们不需要锁定它。
我想你使用这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
和write
写入文件开头的最后一个线程文件(不使用追加)。
实际上没有最后写入....所有的写入都是'追加',并且由上面提到的代码。我从georgexsh得到了解决方案,即锁定不需要追加,但我仍然无法解释它的行为。 – ubanthia
该文档似乎认为'FileLock'中的文件参数不应写入。 – quamrana
我正在写入外部文件,而不是由FileLock类给出的文件参数。 – ubanthia
您对'FileLock'的调用引用了“PATH”。你的open()调用也会引用“PATH”。它在我看来你正在使用“PATH”作为你想写入的锁和文件。 – quamrana