2017-10-08 58 views
0

我有一个循环每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是原子的,因此我们不需要锁定它。

+0

该文档似乎认为'FileLock'中的文件参数不应写入。 – quamrana

+0

我正在写入外部文件,而不是由FileLock类给出的文件参数。 – ubanthia

+0

您对'FileLock'的调用引用了“PATH”。你的open()调用也会引用“PATH”。它在我看来你正在使用“PATH”作为你想写入的锁和文件。 – quamrana

回答

0

我想你使用这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) 

收购了文件锁将举行它的第一个线程,如你预期其他线程将被阻止。


+0

在我的情况下,我看到该文件有来自最新线程的数据,并且来自所有先前线程的数据被删除。此外,我不能使用time.sleep(),因为我的代码应该具有时间意识。是的,我正在使用filelock软件包。 – ubanthia

+0

@ubanthia你想完成什么? – georgexsh

+0

我试图通过多个python脚本在文件中追加数据,每个脚本每隔几秒发布一次新线程。用于Algo交易目的。 – ubanthia

0

我假设你的意思是要做到这一点:

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软件写东西,它清除了该文件,并调用openwrite写入文件开头的最后一个线程文件(不使用追加)。

+0

实际上没有最后写入....所有的写入都是'追加',并且由上面提到的代码。我从georgexsh得到了解决方案,即锁定不需要追加,但我仍然无法解释它的行为。 – ubanthia