我目前正在尝试找到一种方法,让一个线程在文件中写入日志,而另一个线程读取并处理日志。我发现a way(第5部分)可以连续读取文件中的数据,但是将文件写入数据中确实有问题。
当我尝试在文件中写入内容时,我需要随后将其关闭,否则文件将保持空白。但是,如果我关闭文件,则无法再读取它。 所以我的阅读线程看起来像这样:
def follow(file):
file.seek(0,0)
while True:
line = file.readline()
if not line:
time.sleep(0.1)
continue
yield line
file = open(self.path)
loglines = follow(self.file)
for line in loglines:
print(line)
但是写的时候,我使用了类似的东西:
file = open(self.path, 'w')
file.write(self.generateLog())
file.close()
sleep(self.duration)
但是,一旦调用file.close(),我的阅读部分就会出错:
line 38, in run
for line in loglines:
line 147, in follow
line = file.readline()
ValueError: I/O operation on closed file.
但是,如果在写入后不关闭文件,则永远不会更新。 (我只是在做写作部分,以确保阅读部分可以正常工作。理论上,日志文件将通过apache或其他方式进行更新。)
编辑:感谢flush(),我不再有这个问题了,非常感谢! 但是似乎写作和阅读可能很难。如果打印出我写的行和我读过的行,我将得到类似:
Writing : 158.228.210.37 [...] "GET /cat/rzkpvwons HTTP/1.0" 505 1119
Reading : 5 1119
因此,读数无法读取整行。有什么问题的想法吗?
EDIT2:只是将open(path,'w')更改为open(path,'a +')似乎可以与同花顺结合使用,应该早些考虑过。 非常感谢!
非常感谢你, 贾兹