我需要一个Python脚本,其中后台线程将数据写入文件,而主线程可能从中读取数据。
我知道从多个线程写入文件可能会出现问题,但是如果只有一个线程以写入模式打开文件,而另一个线程仅以读取模式打开文件,可以吗?
我制作了一个小型测试程序,到目前为止它可以工作,但这会在更复杂的程序中产生问题吗?
from threading import Thread
from time import sleep
class Writter(Thread):
def __init__(self) -> None:
super().__init__()
def run(self):
print("Sampler started")
with open("testfile.txt", mode='w') as f:
i = 0
while True:
new_line = f"{i}\n"
f.write(new_line)
f.flush()
i += 1
sleep(1)
if __name__ == '__main__':
writter = Writter()
writter.start()
sleep(2)
with open("testfile.txt", mode='r') as f:
while True:
new_line = f.readline()
if new_line != '':
print(new_line)
我之前在其他项目中使用过队列,但在这里不适合。我需要将数据写入文件,因为读取数据的代码并不总是同时运行。我可以同时执行这两种操作,写入文件并另外写入队列,以便读取器和写入器同时运行。但随后我必须向读取器添加检查,看看它是否需要读取文件或者是否可以使用队列。
如果上面的代码没问题的话,那就更简单了。有什么办法可以打破这个吗?
如果你是从并发的角度来问,那没问题。只有一个线程写入文件,多个线程可以从文件中读取数据而不会损坏数据。
但是这里的另一个问题是,如果写入器线程写入缓慢,读取器线程将在没有任何睡眠的情况下循环 -> 浪费CPU。
您也可以在那里添加 sleep 或使用像 https://pypi.org/project/watchdog/ 这样的项目,它基本上会通知您文件系统中的某些内容是否发生更改。这可能就是你的情况。